本题要用二分查找的方法来做;
很好的一道二分+降维思想的题!
先把前两个数组加起来,存在map中在排序;
然后二分查找t-c[i],看是否存在;;
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
int a[600],b[600],c[600];
int map[300000],n,m,k;
int cmp(const void *a,const void *b)
{
return *(int*)a-*(int*)b;
}
int find (int min,int max,int sum)
{
int mid;
while(min<=max)
{
mid=(min+max)/2;
if(map[mid]==sum)
return 1;
else if(map[mid]<sum)
{
min=mid+1;
}
else
max=mid-1;
}
return 0;
}
int main()
{
int i,j,h,t,p,r=1;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(j=0;j<m;j++)
scanf("%d",&b[j]);
for(h=0;h<k;h++)
scanf("%d",&c[h]);
int ii=0;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
map[ii++]=a[i]+b[j];
qsort(map,ii,sizeof(map[0]),cmp);
scanf("%d",&p);
printf("Case %d:\n",r++);
while(p--)
{
scanf("%d",&t);
int flag=0;
for(i=0;i<h;i++)
{
if(find(0,ii-1,t-c[i]))
flag=1;
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}