http://acm.hdu.edu.cn/showproblem.php?pid=2141
View Code
1 #include<iostream> 2 #include<cstdlib> 3 using namespace std ; 4 #define maxn 505 5 int a[maxn], b[maxn], c[maxn] ; 6 int ab[maxn*maxn] ; 7 int cmp(const void *a, const void *b) 8 { 9 return *(int *)a - *(int *)b ; 10 } 11 int find(int n, int len) 12 { 13 int min, max, mid ; 14 min = 0 ; 15 max = len -1 ; 16 while(min<=max) 17 { 18 mid = (min+max)/2 ; 19 if(ab[mid]==n) 20 return 1 ; 21 if(ab[mid]<n) 22 min = mid + 1 ; 23 if(ab[mid] >n) 24 max = mid - 1 ; 25 } 26 return 0 ; 27 } 28 int main() 29 { 30 int i, j, k , x, s ; 31 int l, n, m ; 32 int times = 1 ; 33 while(cin>>l>>n>>m) 34 { 35 int num = 0 ; 36 for(i=0; i<l; i++) 37 cin>>a[i] ; 38 for(j=0; j<n; j++) 39 cin>>b[j] ; 40 for(k=0; k<m; k++) 41 cin>>c[k] ; 42 for(i=0; i<l; i++) 43 for(j=0; j<n; j++) 44 { 45 ab[num++] = a[i] + b[j] ; 46 } 47 qsort(ab, num, sizeof(ab[0]), cmp) ; 48 cout<<"Case "<<times++<<":"<<endl ; 49 cin>>s ; 50 while(s--) 51 { 52 cin>>x ; 53 int flag = 1 ; 54 for(k=0; k<m; k++) 55 { 56 if(find(x-c[k],num)==1) 57 { 58 flag = 0 ; 59 break ; 60 } 61 } 62 if(flag==0) 63 cout<<"YES"<<endl ; 64 else 65 cout<<"NO"<<endl ; 66 } 67 } 68 return 0 ; 69 }
输入有三个集合,要先合并两个为一,然后再对这个
合并出来的集合进行二分