计算A[i]+B[j]+C[k]=x
转换为A[i]+B[i]=x-C[k] ,这样在A[i]+B[i]中二分查找,x-C[k] ,不会超时。
1 #include<iostream> 2 #include<stdio.h> 3 #include<string> 4 #include<string.h> 5 #include<algorithm> 6 7 using namespace std; 8 int a[505],b[505],c[505]; 9 int sab[250005]; 10 bool Bi_Search(int a[],int n,int b) 11 { 12 int l=0; 13 int r=n-1; 14 int mid; 15 while(l<=r) 16 { 17 mid=(l+r)>>1; 18 if(a[mid]==b) 19 return 1; 20 else if(a[mid]>b) 21 r=mid-1; 22 else 23 l=mid+1; 24 } 25 return 0; 26 } 27 int main() 28 { 29 int L,M,N; 30 int i,j,k; 31 int s; 32 int q,con=1; 33 34 while(cin>>L>>M>>N) 35 { 36 for( i=0;i<L;i++) 37 cin>>a[i]; 38 for( j=0;j<M;j++) 39 cin>>b[j]; 40 for( k=0;k<N;k++) 41 cin>>c[k]; 42 for(k=0,i=0;i<L;i++) 43 for(j=0;j<M;j++) 44 { 45 sab[k++]=a[i]+b[j]; 46 } 47 sort(sab,sab+k); 48 49 cin>>s; 50 cout<<"Case "<<con++<<":"<<endl; 51 while(s--) 52 { 53 cin>>q; 54 for(j=0;j<N;j++) 55 { 56 if(Bi_Search(sab,k,q-c[j])) 57 break; 58 } 59 if(j==N) 60 cout<<"NO"<<endl; 61 else 62 cout<<"YES"<<endl; 63 } 64 } 65 return 0 ; 66 }