题目链接:点我点我
题意:给出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暴力二分
时间: 2024-11-19 20:25:22