hdu2141: Can you find it?

hdu2141: http://acm.hdu.edu.cn/showproblem.php?pid=2141
题意:给出3个数列a、b、c,再给出s个x,问是否存在a[i]+b[j]+c[k]=x 解法:先让a+b,得到和数列sum,并排序,再给c排序,再二分搜sum中是否存在sum[i]=x-c[j] code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
    return a<b;
}
int a[600],b[600],c[600],sum[600*600];
int main()
{
    int l,m,n,s,x,v,w,t=0;
    while(scanf("%d%d%d",&l,&m,&n)!=EOF)
    {
        t++;
        for(int i=0;i<l;i++)
            scanf("%d",&a[i]);
        for(int i=0;i<m;i++)
            scanf("%d",&b[i]);
        for(int i=0;i<n;i++)
            scanf("%d",&c[i]);
        int k=0;
        for(int i=0;i<l;i++)
        {
            for(int j=0;j<m;j++)
                sum[k++]=a[i]+b[j];
        }
        sort(sum,sum+k,cmp);
        sort(c,c+n,cmp);
        scanf("%d",&s);
        printf("Case %d:\n",t);
        for(int i=0;i<s;i++)
        {
            scanf("%d",&x);w=0;
            for(int i=0;i<n;i++)
            {
                v=x-c[i];
                int max=k-1,min=0,z;
                if(sum[max]==v||sum[min]==v){w=1;break;}
                while(max>min)  //二分搜索
                {
                   z=(max+min)/2;
                   if(sum[z]==v)
                   {
                       w=1;break;
                   }
                   else if(sum[z]>v)max=z;
                   else  min=z+1;
                }
                if(w==1)break;
            }
            if(w)printf("YES\n");
            else printf("NO\n");
        }
    }
}
/*input:
3 3 3
1 2 3
1 2 3
1 2 3
3
1
4
10
output:
Case 1:
NO
YES
NO*/

posted on 2012-07-25 21:50  acmer-jun  阅读(149)  评论(0编辑  收藏  举报

导航