二分查找
把a[A]数组和b[B]数组相加,得到ab[A*B]。
然后二分查找。
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
#define maxn 504
bool cmp(int a,int b)
{
return a<b;
}
int main()
{
int a[maxn];
int b[maxn];
int ab[maxn*maxn];
int c[maxn];
int A,B,C;
int flag=1;
int m;
while(cin>>A>>B>>C)
{
int i,j;
for(i=0;i<A;i++)
cin>>a[i];
for(i=0;i<B;i++)
cin>>b[i];
for(i=0;i<C;i++)
cin>>c[i];
int k=0;
for(i=0;i<A;i++)
for(j=0;j<B;j++)
ab[k++]=a[i]+b[j];
sort(ab,ab+A*B,cmp);
sort(c,c+C,cmp);
cin>>m;
printf("Case %d:\n",flag);
while(m--)
{
int x;
int f=0;
cin>>x;
for(i=0;i<C;i++)
{
int l=0,r=A*B-1;
int mid=(l+r)/2;
while(abs(l-r)>1&&!f)
{
if(x-c[i]>ab[mid])
l=mid;
else
if(x-c[i]<ab[mid])
r=mid;
else
f=1;
mid=(l+r)/2;
}
if(f)
break;
}
if(f)
printf("YES\n");
else
printf("NO\n");
}
flag++;
}
return 0;
}