#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