标签:
初看很简单就是判断三个数加起来的和,但是三个for循环速度还是很慢的,所以细想要用到二分查找。
把函数改为:A+B=X-C,然后二分搜一下就可以了。
完全用的是二分查找的模板。
1 #include <stdio.h> 2 #include <math.h> 3 #include <queue> 4 #include <vector> 5 #include <stack> 6 #include <map> 7 #include <string> 8 #include <string.h> 9 #include <algorithm> 10 #include <iostream> 11 using namespace std; 12 #define K 505 13 int LN[K*K]; 14 int binarysearch(int a[],int l,int r,int k){ 15 int mid; 16 while(r-l>1){ 17 mid=(r+l)/2; 18 if(a[mid]<=k) 19 l=mid; 20 else 21 r=mid; 22 } 23 if(a[l]==k) 24 return 1; 25 else 26 return 0; 27 }//二分查找 28 int main() 29 { 30 int i,j,count=1,q; 31 int L[K],N[K],M[K],s,n,m,l; 32 while(~scanf("%d%d%d",&l,&n,&m)){ 33 int h=0; 34 for(i=0;i<l;i++) 35 scanf("%d",&L[i]); 36 for(i=0;i<n;i++) 37 scanf("%d",&N[i]); 38 for(i=0;i<m;i++) 39 scanf("%d",&M[i]); 40 for(i=0;i<l;i++) 41 for(j=0;j<n;j++) 42 LN[h++]=L[i]+N[j]; 43 sort(LN,LN+h); 44 scanf("%d",&s); 45 printf("Case %d:\n",count++); 46 for(i=0;i<s;i++) 47 { 48 scanf("%d",&q); 49 int p=0; 50 for(j=0;j<m;j++) 51 { 52 int a=q-M[j]; 53 if(binarysearch(LN,0,h,a)) 54 { 55 printf("YES\n"); 56 p=1; 57 break; 58 } 59 } 60 if(!p) 61 printf("NO\n"); 62 } 63 } 64 return 0; 65 }
hdu 2141 Can you find it?(二分查找变例)
标签:
原文地址:http://www.cnblogs.com/wangmengmeng/p/4711361.html