#include <cstdio>
#include <algorithm>
#include <map>
#include <vector>
#include <cstring>
#define maxn 550
using namespace std;
int a[maxn],b[maxn],c[maxn],d[maxn*maxn];
int main()
{
// freopen("input.txt","r",stdin);
int l,m,n;int cnt=0;
while(scanf("%d%d%d",&l,&n,&m)!=EOF){
for(int i=0;i<l;i++) scanf("%d",a+i);
for(int i=0;i<n;i++) scanf("%d",b+i);
for(int i=0;i<m;i++) scanf("%d",c+i);
for(int i=0;i<l;i++)
for(int j=0;j<n;j++)
d[i*l+j]=a[i]+b[j];
sort(d,d+l*n);
int T;cin>>T;
int s;
cout<<"Case "<<++cnt<<":"<<endl;
while(T--){
scanf("%d",&s);
bool ok=false;
for(int i=0;i<m;i++)
if(binary_search(d,d+l*n,s-c[i])) {ok=true;break;}
if(ok) printf("YES\n");else printf("NO\n");
}
}
return 0;
}
#include<stdio.h>
#include<algorithm>
using namespace std;
#define K 505
int LN[K*K];
int BinarySearch(int LN[],int h,int t)/*二分查找*/
{
int left,right,mid;
left=0;
right=h-1;
mid=(left+right)/2;
while(left<=right)
{
mid=(left+right)/2;
if(LN[mid]==t)
return 1;
else if(LN[mid]>t)
right=mid-1;
else if(LN[mid]<t)
left=mid+1;
}
return 0;
}
int main()
{
int i,j,count=1,q;
__int32 L[K],N[K],M[K],S,n,m,l;
while(scanf("%d%d%d",&l,&n,&m)!=EOF)
{
int h=0;
for(i=0;i<l;i++)
scanf("%d",&L[i]);
for(i=0;i<n;i++)
scanf("%d",&N[i]);
for(i=0;i<m;i++)
scanf("%d",&M[i]);
for(i=0;i<l;i++)
for(j=0;j<n;j++)
LN[h++]=L[i]+N[j];/*合并L和N*/
sort(LN,LN+h); /*对LN数组排序*/
scanf("%d",&S);
printf("Case %d:\n",count++);
for(i=0;i<S;i++)
{
scanf("%d",&q);/*q即为题目中的x*/
int p=0; /*p为标记,0为找不到,1为能找到*/
for(j=0;j<m;j++)
{
int a=q-M[j]; /*因为L[i]+N[j]+M[k]==q,所以q-M[k]=LN[h]*/
if(BinarySearch(LN,h,a)) /*在LN数组中查找到a*/
{
printf("YES\n");
p=1;
break;
}
}
if(!p) /*找不到a*/
printf("NO\n");
}
}
return 0;
}
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 const int maxn = 505; 6 const int mod = 600000; 7 const int INF = (1<<30); 8 struct node 9 { 10 int key; 11 int count; 12 }h[mod]; 13 int a[maxn]; 14 int b[maxn]; 15 int c[maxn]; 16 17 void add(int p) 18 { 19 int k = p%mod; 20 if (k < 0) 21 k += mod; 22 while (h[k].count != 0) 23 { 24 if (h[k].key == p) 25 { 26 h[k].count++; 27 break; 28 } 29 k = (k+1)%mod; 30 } 31 if (h[k].count == 0) 32 { 33 h[k].count++; 34 h[k].key = p; 35 } 36 } 37 bool find(int p) 38 { 39 int k = p%mod; 40 if (k < 0) 41 k += mod; 42 while (h[k].count!=0) 43 { 44 if (h[k].key == p) 45 return true; 46 k = (k+1)%mod; 47 } 48 return false; 49 } 50 int main() 51 { 52 int i, j,k; 53 int l, n, m, s; 54 int p; 55 int ca = 1; 56 while (scanf("%d %d %d",&l,&m,&n)!=EOF) 57 { 58 memset(h,0,sizeof(h)); 59 for (i=0; i<l; i++) 60 scanf("%d",&a[i]); 61 for (i=0; i<m; i++) 62 scanf("%d",&b[i]); 63 for (i=0; i<n; i++) 64 scanf("%d",&c[i]); 65 sort(a,a+l); 66 sort(b,b+m); 67 sort(c,c+n); 68 for (i=0; i<l; i++) 69 for (j=0; j<m; j++) 70 add(a[i]+b[j]); 71 bool flag=false; 72 scanf("%d",&s); 73 printf("Case %d:\n",ca++); 74 while (s--) 75 { 76 int p; 77 scanf("%d",&p); 78 /* if (a[0]+b[0]+c[0]>p || a[l-1]+b[m-1]+c[n-1]<p) 79 { 80 printf("NO\n"); 81 continue; 82 }*/ 83 for (i=0; i<n; i++) 84 if (find(p-c[i])) 85 break; 86 printf("%s\n",i==n?"NO":"YES"); 87 } 88 } 89 return 0; 90 }
原文:http://www.cnblogs.com/Canace/p/4360842.html