晕,这一题我是准备暴力的,但是这里给的数据有点大,那样是会TLE的,网上搜搜,无语啦,竟然可以这样来思考:合并前两个数组,然后再二分……
#include "stdio.h"
#include "stdlib.h"
int li[505];
int mi[505];
int ni[505];
int join[250005];
int cmp(const void *a,const void *b)
{
int *c,*d;
c=(int *)a;
d=(int *)b;
return *c-*d;
}
int main()
{
int l,m,n;
int s;
int count=1;
int i,k,j,f,a,t;
int start,end,mid;
while(scanf("%d%d%d",&l,&m,&n)==3)
{
for(i=0;i<l;i++)
{
scanf("%d",&li[i]);
}
for(i=0;i<m;i++)
{
scanf("%d",&mi[i]);
}
for(i=0;i<n;i++)
{
scanf("%d",&ni[i]);
}
k=0;
for(i=0;i<l;i++)
{
for(j=0;j<m;j++)
join[k++]=li[i]+mi[j];
}
qsort(join,k,sizeof(int),cmp);
qsort(ni,n,sizeof(int),cmp);
printf("Case %d:\n",count++);
scanf("%d",&s);
for(i=0;i<s;i++)
{
scanf("%d",&a);
t=0;
for(j=0;j<n;j++)
{
f=0;
start=0;end=k-1;
mid=(start+end)/2;
while(start<=end)
{
if(a-ni[j]>join[mid])
{
start=mid+1;
}
else if(a-ni[j]<join[mid])
{
end=mid-1;
}
else
{
f=1;
break;
}
mid=(start+end)/2;
}
if(f)
{
t=1;
break;
}
}
if(t)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
}
return 0;
}