题目大意:
就是给你三个数组,在每个数组中拿一个代表出来计算其和判断能否组合出一个值恰好是S
解题思路:
二分。。。。将这三个数组中的任意两个的和给枚举出来,数组开到500*500.然后枚举另一个,二分新数组,恩,就是这么简单的。
#include<stdio.h>
#include<algorithm>
#define N 505
using namespace std;
int main()
{
int a[N],b[N],c[N],d[N*N];
int l,n,m;
int i,s,j,k;
int right,left,mid;
bool flag;
int cnt=0;
while(scanf("%d%d%d",&l,&n,&m)!=EOF)
{
cnt++;
for(i=0;i<l;i++)
scanf("%d",&a[i]);
sort(a,a+l);
for(i=0;i<n;i++)
scanf("%d",&b[i]);
for(i=0;i<m;i++)
scanf("%d",&c[i]);
k=0;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
d[k++]=b[i]+c[j];
m=k;
sort(d,d+m);
scanf("%d",&k);
printf("Case %d:\n",cnt);
while(k--){
flag=false;
scanf("%d",&s);
for(i=0;i<l;i++)
{
n=s-a[i];
left=0;right=m-1;
while(left<right)
{
mid=(left+right)/2;
if(n==d[mid])
{
flag=true;
break;
}
if(d[mid]>n)
right=mid;
else
left=mid+1;
}
if(flag)
break;
}
if(flag)
puts("YES");
else
puts("NO");
}
}
return 0;
}