【校OJ】选网线

暑假学校OJ上的题目。

一道很有意思的二分。

题意:三个数组,每个数组各选一个数出来看是否能组成目标数。

题解:前两个数组两两的和组合一下,二分第三个数组,找是否能组成目标数。

代码:

 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 } 
View Code

猜你喜欢

转载自www.cnblogs.com/Asumi/p/9457960.html