链接 : http://acm.hdu.edu.cn/showproblem.php?pid=2141
题意 : 给你一个数X,再给你A,B,C三组数字,问你能否从三组中各找出一个数,满足方程A+B+C=X
将前两个数组合并为一个和数组,再对和数组二分查找(给定数-c[i])即可
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int v=0,sum[501*501];
bool binfind(int x,int l,int r)
{
int m=(l+r)/2;
if(l<=r)
{
if(sum[m]==x) return 1;
else if(sum[m]<=x) binfind(x,m+1,r);
else if(sum[m]>x) binfind(x,l,m-1);
}
else return 0;
}
int main()
{
int l,n,m,k=1;
while(cin>>l>>n>>m)
{
int i,s,a[501],b[501],c[501];
v=0;
for(i=0; i<l; i++) cin>>a[i];
for(i=0; i<n; i++) cin>>b[i];
for(i=0; i<m; i++) cin>>c[i];
sort(c,c+m);
for(i=0; i<l; i++)
for(int j=0; j<n; j++)
sum[v++]=a[i]+b[j];
sort(sum,sum+v);
cin>>s;
cout<<"Case "<<k++<<":"<<endl;
while(s--)
{
int x;
bool flag=0;
cin>>x;
for(i=0; i<m; i++)
if(binfind(x-c[i],0,v))
{
flag=1;
break;
}
printf(flag ? "YES\n" : "NO\n");
}
}
return 0;
}