题意:输出三个数代表三个数组长度,接下来若从三个数组各取一个数能得则YES。
思路:转化成俩个数组的二分运算。
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int a[500],b[500],c[500],d[250005],i,j,t,x,n,m,z=1,u;
while(scanf("%d%d%d",&n,&m,&t)!=EOF)
{
int k=0;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<m;i++)
scanf("%d",&b[i]);
for(i=0;i<t;i++)
scanf("%d",&c[i]);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
d[k++]=a[i]+b[j];
printf("Case %d:\n",z++);
sort(d,d+k);
scanf("%d",&u);
while(u--)
{
int f=0;
scanf("%d",&x);
for(i=0;i<t;i++)
{
int l=0,r=k-1,mid;
while(r>=l)
{
mid=(l+r)/2;
if(d[mid]+c[i]==x)
{
f=1;
break;
}
else if(d[mid]+c[i]>x)
r=mid-1;
else if(d[mid]+c[i]<x)
l=mid+1;
}
if(f==1)
break;
}
if(f==1)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}
3 3 3
1 2 3
1 2 3
1 2 3
3
1
4
10