HDU2141 Can you find it?

來源:互聯網
上載者:User
                                                       Can you find it?

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

Problem DescriptionGive 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. 

InputThere 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. 

OutputFor 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 31 2 31 2 31 2 331410
 

Sample Output

Case 1:NOYESNO
 

Authorwangye 

SourceHDU 2007-11 Programming Contest 

Recommend威士忌

解題思路:數組合并+二分尋找(搜尋),(解法一)
          這個搜尋讓額淚牛滿面啊,真的想先到用數組尋找,最近搜尋搜得吐蒙頭。。。。。。
        
          開始,搜尋一個數組得出x-d[i]的差值後,再在合并的數組裡面搜尋差值即可。

#include<stdio.h>#include<algorithm>using namespace std;#define K 505int LN[K*K];int BinarySearch(int LN[],int h,int t)/*二分尋找*/{    int left,right,mid;    left=0;    right=h-1;    mid=(left+right)/2;    while(left<=right)    {        mid=(left+right)/2;        if(LN[mid]==t)          return 1;        else if(LN[mid]>t)          right=mid-1;        else if(LN[mid]<t)          left=mid+1;    }    return 0;}int main(){    int i,j,count=1,q;    __int32 L[K],N[K],M[K],S,n,m,l;    while(scanf("%d%d%d",&l,&n,&m)!=EOF)    {        int h=0;        for(i=0;i<l;i++)         scanf("%d",&L[i]);        for(i=0;i<n;i++)          scanf("%d",&N[i]);        for(i=0;i<m;i++)          scanf("%d",&M[i]);        for(i=0;i<l;i++)          for(j=0;j<n;j++)           LN[h++]=L[i]+N[j];/*合并L和N*/        sort(LN,LN+h); /*對LN數組排序*/        scanf("%d",&S);        printf("Case %d:\n",count++);        for(i=0;i<S;i++)        {            scanf("%d",&q);/*q即為題目中的x*/            int p=0; /*p為標記,0為找不到,1為能找到*/            for(j=0;j<m;j++)            {                int a=q-M[j]; /*因為L[i]+N[j]+M[k]==q,所以q-M[k]=LN[h]*/                if(BinarySearch(LN,h,a)) /*在LN數組中尋找到a*/                {                    printf("YES\n");                    p=1;                    break;                }            }            if(!p) /*找不到a*/              printf("NO\n");        }    }    return 0;}

解題思路:數組合并+set尋找(搜尋),(方法二)STL
         該解法,首先感謝蠶豆兒(http://blog.csdn.net/wqc359782004)給我靈感,他說可以用map搜尋,我才想到用STL的,後面發現map超記憶體了,才想起記憶體需求更小的set(map的1/2就好了)。
         開始,搜尋一個數組得出x-d[i]的差值後,再在合并的數組的set裡面搜尋差值即可。
                       附:STL函數方法集合(http://blog.csdn.net/lsh670660992/article/details/9204285),map用法(http://blog.csdn.net/lsh670660992/article/details/9158539),set用法(http://blog.csdn.net/lsh670660992/article/details/9158573)

#include<cstdio>#include<cstring>#include<algorithm>#include<set>    //用到STL中得set作為尋找輔助using namespace std;int main(){    int b[500];    int c[500];    int d[500];    set< int> st;  //set定義,不能用map<int ,int>,記憶體翻倍,會記憶體    int x;    int l,n,m;    int i,j,p=1;    while(scanf("%d%d%d",&l,&n,&m)!=EOF)    {        memset(b,0,sizeof(b));        memset(c,0,sizeof(c));        memset(d,0,sizeof(d));        for(i=0;i<l;i++)            scanf("%d",&b[i]);        for(i=0;i<n;i++)            scanf("%d",&c[i]);        for(i=0;i<m;i++)            scanf("%d",&d[i]);        for(j=0;j<n;j++)    //數組合并            for(i=0;i<l;i++)                st.insert(b[i]+c[j]);   //值插入        printf("Case %d:\n",p++);        scanf("%d",&n);        while(n--)        {            int s;            scanf("%d",&x);            for(i=0;i<m;i++)                if(st.count(x-d[i]))  //值檢索,存在返回1,不存在返回0                {                    printf("YES\n");                    break;                }            if(i==m)                printf("NO\n");        }        st.clear();    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.