首页 > 其他 > 详细

【校OJ】选网线

时间:2018-08-10 23:48:44      阅读:131      评论:0      收藏:0      [点我收藏+]

暑假学校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

 

【校OJ】选网线

原文:https://www.cnblogs.com/Asumi/p/9457960.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!