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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU - 2141 Can you find it?(二分)相关的知识,希望对你有一定的参考价值。

题目链接:点我点我

题意:给出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?(二分)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 2141 Can you find it? 二分查找

HDU 2141 Can you find it? (二分)

hdu2141Can you find it?

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

HDU 2141 can you find it 二分

hdoj-2141-Can you find it?