1. 程式人生 > >HDU 2141 Can you find it? (二分)

HDU 2141 Can you find it? (二分)

input int you time chm source tis 去掉 註意

題目鏈接:

Can you find it?

Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others)
Total Submission(s): 38634 Accepted Submission(s): 9395


Problem Description Give you three sequences of numbers A, B, C, then we give you a number X. Now you need to calculate if you can find the three numbers Ai, Bj, Ck, which satisfy the formula Ai+Bj+Ck = X.

Input There are many cases. Every data case is described as followed: In the first line there are three integers L, N, M, in the second line there are L integers represent the sequence A, in the third line there are N integers represent the sequences B, in the forth line there are M integers represent the sequence C. In the fifth line there is an integer S represents there are S integers X to be calculated. 1<=L, N, M<=500, 1<=S<=1000. all the integers are 32-integers.

Output For each case, firstly you have to print the case number as the form "Case d:", then for the S queries, you calculate if the formula can be satisfied or not. If satisfied, you print "YES", otherwise print "NO".

Sample Input 3 3 3 1 2 3 1 2 3 1 2 3 3 1 4 10

Sample Output Case 1: NO YES NO

Author wangye

Source HDU 2007-11 Programming Contest

題目大意:

多組數據輸入

第一行是三個序列各自元素的個數

第2,3,4是三個序列

第4行是x的個數

下面的x行是多種情況的x值

分析:

三個序列三個數組,把前面兩個數組組合為一個數組

比如1 2 3,1 2 3,這兩個序列組合為一個數組‘

1+1,1+2,1+3,2+1,2+2,2+3,3+1,3+2,3+3,

計算一下就是

2,3,4,3,4,5,4,5,6,有重復的但是不用去掉,稱這個序列為t

然後與第三個序列組合

1 ,2,3,(第三個序列)

然後將t序列升序排序,t與第三個序列組合的時候,t序列采用二分尋找數據

註意點:

1.不能采用set去重,不然會超內存(第一次遇到超內存,好激動啊啊啊啊啊)

2.對t序列不能采用for循環尋找數據,要采用排好序之後再二分查找數據,不然會超時

代碼如下:

#include<bits/stdc++.h>
using namespace std;
bool cmp(int a,int b)
{
    return a<b;
}
int main()
{
    int n1,n2,n3,n=1;
    while(~scanf("%d %d %d",&n1,&n2,&n3))
    {
        int a[n1],b[n2],c[n3];
        for(int i=0; i<n1; i++)
        {
            scanf("%d",&a[i]);
        }
        for(int j=0; j<n2; j++)
        {
            scanf("%d",&b[j]);
        }
        for(int k=0; k<n3; k++)
        {
            scanf("%d",&c[k]);
        }
        int xn;
        int t[n1*n2];
        scanf("%d",&xn);
        int x[xn];
        for(int i=0; i<xn; i++)
        {
            scanf("%d",&x[i]);
        }
        int y=0;
        for(int i=0; i<n1; i++)
        {
            for(int j=0; j<n2; j++)
            {
                int z=a[i]+b[j];
                t[y]=z;
                y++;
            }
        }
        sort(t,t+(n1*n2),cmp);
        printf("Case %d:\n",n);
        for(int i=0; i<xn; i++)
        {
            int f=0;
            for(int k=0;k<n3;k++)
            {
                int l=0,h=n1*n2-1;
                while(l<=h)
                {
                    int mid=(l+h)/2;

                    if(t[mid]==x[i]-c[k])
                    {
                        f=1;
                        break;
                    }else if(t[mid]>x[i]-c[k])
                    {
                        h=mid-1;
                    }else if(t[mid]<x[i]-c[k])
                    {
                        l=mid+1;
                    }
                }
                if(f==1)
                    break;
            }
            if(f==1)
            {
                printf("YES\n");
            }
            else
            {
                printf("NO\n");
            }
        }
        n++;
    }
    return 0;
}

哈哈哈哈哈哈哈哈哈哈

今天真的是超級開心

不準吐槽。。。。。

。。。。。。。。。。

HDU 2141 Can you find it? (二分)