#include<cstdio>
#include<algorithm>
using namespace std;
int a[505],b[505],c[505],f[250010];
int binary(int x,int M,int k)
{
for(int i=0; i<M; i++)
{
int l = 0, r = k;
while(l <= r)
{
int mid = (l+r)/2;
if(x > c[i]+f[mid]) l = mid+1;
else if(x < c[i]+f[mid]) r = mid-1;
else return 1;
}
}
return 0;
}
int main()
{
int L,N,M,i,j,s,t=1;
while(~scanf("%d%d%d", &L,&N,&M))
{
for(i=0; i<L; i++)
scanf("%d", a+i);
for(i=0; i<N; i++)
scanf("%d", b+i);
for(i=0; i<M; i++)
scanf("%d", c+i);
int k = 0;
for(i=0; i<L; i++)
for(j=0; j<N; j++)
f[k++] = a[i]+b[j];
sort(f,f+k);
scanf("%d", &s);
printf("Case %d:\n", t++);
while(s--)
{
int x;
scanf("%d", &x);
printf(binary(x,M,k-1) ? "YES\n" : "NO\n");
}
}
return 0;
}
这个题的思路是:先对前两个相加,排序,然后再逐个与第三个相加,看看匹不匹配(二分法)。
天天写算法之Can you find it?
最新推荐文章于 2020-01-13 18:43:43 发布