Can you find it?
Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others)Total Submission(s): 7954 Accepted Submission(s): 2073
3 3 3 1 2 3 1 2 3 1 2 3 3 1 4 10
Case 1: NO YES NO
将a数组和b数组先相加成一个数组sab[500*500]。这样就相当于sab[i] + c[j] = s。
再变形一下, sab[i] = s - c[j].
这样只要在sab数组中用二分查找是否存在s-c[j]就可以了。
#include<iostream>
#include<algorithm>
using namespace std;
int a[505],b[505],c[505],sab[250005];
bool find(int s,int b,int e)
{
if(b>e)return false;
int mid=(b+e)/2;
if(sab[mid]==s)
return true;
else if(sab[mid]>s)
find(s,b,mid-1);
else
find(s,mid+1,e);
}
int main()
{
int L,N,M,S;
int i,x,j;
int cnt=1;
while(scanf("%d%d%d",&L,&N,&M)!=EOF)
{
int k;
for(i=0;i<N;i++)scanf("%d",&a[i]);
for(i=0;i<M;i++)scanf("%d",&b[i]);
for(i=0;i<L;i++)scanf("%d",&c[i]);
for(k=0,i=0;i<L;i++)
for(j=0;j<N;j++)
sab[k++]=a[i]+b[j];
sort(sab,sab+k);
scanf("%d",&S);
cout << "Case " << cnt++ << ":\n";
for(i=0;i<S;i++)
{
scanf("%d",&x);
for(j=0;j<M;j++)
{
if(find(x-c[j],0,k-1)) //查找是否有满足的和
break;
}
if( j == M)
cout << "NO\n";
else
cout << "YES\n";
}
}
return 0;
}