杭电 2141 Can you find it? (二分法)
Description
Give you three sequences of numbers A, B, C, then we give you a number X. Now you need to calculate if you can find the three numbers Ai, Bj, Ck, which satisfy the formula Ai+Bj+Ck = X.
Input
There are many cases. Every data case is described as followed: In the first line there are three integers L, N, M, in the second line there are L integers represent the sequence A, in the third line there are N integers represent the sequences B, in the forth line there are M integers represent the sequence C. In the fifth line there is an integer S represents there are S integers X to be calculated. 1<=L, N, M<=500, 1<=S<=1000. all the integers are 32-integers.
Output
For each case, firstly you have to print the case number as the form "Case d:", then for the S queries, you calculate if the formula can be satisfied or not. If satisfied, you print "YES", otherwise print "NO".
Sample Input
3 3 3
1 2 3
1 2 3
1 2 3
3
1
4
10
Sample Output
Case 1:
NO
YES
NO
定义三个数组分别存a,b,c的值,再定义数组d存a和b所有可能的和,用给定的数减去c数组中的数得到k,用二分法在d数组找k值,若能找到输出yes,否则输出no。
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int a[505],b[505],c[505],d[505*505]; 5 int main() 6 { 7 int j,l,p,m,n,i,k,t,s,num,r,le,mid,key; 8 num=0; 9 while(scanf("%d %d %d",&l,&m,&n)!=EOF) 10 { 11 for(i = 0 ; i < l ; i++) 12 { 13 scanf("%d",&a[i]); 14 } 15 for(i = 0 ; i < m ; i++) 16 { 17 scanf("%d",&b[i]); 18 } 19 for(i = 0 ; i < n ; i++) 20 { 21 scanf("%d",&c[i]); 22 } 23 p=0; 24 for(i = 0 ; i < l ; i++) 25 { 26 for(j = 0 ; j < m ; j++) 27 { 28 d[p++]=a[i]+b[j]; 29 } 30 } 31 sort(c,c+n); 32 sort(d,d+p); 33 scanf("%d",&t); 34 printf("Case %d:\n",++num); 35 while(t--) 36 { 37 scanf("%d",&s); 38 key=0; 39 for(i = 0 ; i < n ; i++) 40 { 41 k=s-c[i]; 42 le=0; 43 r=p-1; 44 while(le <= r) 45 { 46 mid=(le+r)/2; 47 if(k == d[mid]) 48 { 49 key=-1; 50 break; 51 } 52 if(k > d[mid]) 53 { 54 le=mid+1; 55 } 56 else 57 { 58 r=mid-1; 59 } 60 } 61 if(key == -1) break; 62 } 63 if(key == -1) printf("YES\n"); 64 else 65 printf("NO\n"); 66 } 67 } 68 }
——将来的你会感谢现在努力的自己。