码迷,mamicode.com
首页 > 其他好文 > 详细

【校OJ】选网线

时间:2018-08-11 01:30:33      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:mil   ios   src   std   sans   const   out   open   int   

暑假学校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】选网线

标签:mil   ios   src   std   sans   const   out   open   int   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!