【校OJ】选网线
暑假学校OJ上的题目。
一道很有意思的二分。
题意:三个数组,每个数组各选一个数出来看是否能组成目标数。
题解:前两个数组两两的和组合一下,二分第三个数组,找是否能组成目标数。
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<vector> 5 #include<algorithm> 6 #include<cmath> 7 using namespace std; 8 const int maxn = 1001; 9 10 int l,n,m; 11 int a[maxn]; 12 int b[maxn]; 13 int c[maxn]; 14 int sum[maxn]; 15 int cnt = 1; 16 17 int find(int x){ 18 for(int i = 1; i <= m; i ++){ 19 int l = 1,r = cnt+1; 20 int mid; 21 while( l <= r){ 22 mid = ( l + r) >> 1; 23 if(c[i] + sum[mid] == x){ 24 return true; 25 } 26 else if(c[i] + sum[mid] < x){ 27 l = mid + 1; 28 } 29 else if(c[i] + sum[mid] > x){ 30 r = mid - 1; 31 } 32 } 33 } 34 return false; 35 } 36 37 int main(){ 38 cin>>l>>n>>m; 39 for(int i = 1; i <= l ;i++){ 40 cin>>a[i]; 41 } 42 for(int i = 1; i <= n ;i++){ 43 cin>>b[i]; 44 } 45 for(int i = 1; i <= m ;i++){ 46 cin>>c[i]; 47 } 48 for(int i = 1; i <= l ;i++){ 49 for(int j = 1; j <= n ;j++){ 50 sum[cnt++] = a[i]+b[j]; 51 } 52 } 53 sort(sum+1,sum+1+n); 54 int s; 55 cin>>s; 56 while(s--){ 57 int x; 58 cin>>x; 59 if(find(x)){ 60 cout<<"Yes"<<endl; 61 } 62 else{ 63 cout<<"No"<<endl; 64 } 65 } 66 67 return 0; 68 }