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

HDU - 2141 Can you find it?(二分)

时间:2017-09-11 22:59:19      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:include   color   names   show   find   code   log   href   print   

题目链接:点我点我

题意:给出L个A,N个B,M个C,然后S个X,求能否找出解使得Ai+Bj+Ck = X.成立

题解:TLE了一晚上。这道题其实就是个暴力二分,前把三组数中任意两组数先合并,只不过最后的时候转变一下思想,不要直接去求使X成立的条件,

而是反过去把X当作条件(但是有些大神直接set+set的find()函数过了,当我没说,(捂脸逃....)

1.巧妙暴力二分

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 const int N=300000;
 6 int x[N],y[N],z[N],t[N];
 7 
 8 int solve(int l,int r,int tar){
 9     while(l<=r){
10         int mid=(l+r)>>1;
11         if(z[mid]==tar) return mid;    
12         else if(z[mid]>tar) r=mid-1;
13         else if(z[mid]<tar) l=mid+1;
14     }
15     return -1;
16 }
17 
18 int main(){
19     int a,b,c,d,tmp,Case=1;
20     while(scanf("%d %d %d",&a,&b,&c)!=EOF){
21         printf("Case %d:\n",Case++);
22         int cnt=0;
23         for(int i=0;i<a;i++) scanf("%d",&x[i]);
24         for(int i=0;i<b;i++) scanf("%d",&y[i]);
25         for(int i=0;i<c;i++){
26             scanf("%d",&tmp);
27             for(int j=0;j<b;j++){
28                 z[cnt++]=tmp+y[j];
29             }
30         }
31         scanf("%d",&d);
32         for(int i=0;i<d;i++) scanf("%d",&t[i]);
33         sort(x,x+a); 
34         sort(z,z+cnt);
35         for(int i=0;i<d;i++){
36             int flag=0;
37             for(int j=0;j<a;j++){
38                 if(solve(0,cnt-1,t[i]-x[j])!=-1) {flag=1;break;}
39             }
40             if(flag) printf("YES\n");
41             else printf("NO\n");
42         }
43         
44     }
45     return 0;
46 }

2.set暴力二分

 

HDU - 2141 Can you find it?(二分)

标签:include   color   names   show   find   code   log   href   print   

原文地址:http://www.cnblogs.com/Leonard-/p/7507253.html

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