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*/