hdu 2141 二分查找,三个数相加

来源:互联网 发布:网络品牌策略研究论文 编辑:程序博客网 时间:2024/05/18 09:50

计算A[i]+B[j]+C[k]=x

转换为A[i]+B[i]=x-C[k] ,这样在A[i]+B[i]中二分查找,x-C[k] ,不会超时。

 1 #include<iostream> 2 #include<stdio.h> 3 #include<string> 4 #include<string.h> 5 #include<algorithm> 6  7 using namespace std; 8 int a[505],b[505],c[505]; 9 int sab[250005];10 bool Bi_Search(int a[],int n,int b)11 {12     int l=0;13     int r=n-1;14     int mid;15     while(l<=r)16     {17         mid=(l+r)>>1;18         if(a[mid]==b)19             return 1;20         else if(a[mid]>b)21             r=mid-1;22         else23             l=mid+1;24     }25     return 0;26 }27 int main()28 {29     int L,M,N;30         int i,j,k;31         int s;32         int q,con=1;33 34     while(cin>>L>>M>>N)35     {36         for( i=0;i<L;i++)37             cin>>a[i];38         for( j=0;j<M;j++)39             cin>>b[j];40         for( k=0;k<N;k++)41             cin>>c[k];42         for(k=0,i=0;i<L;i++)43             for(j=0;j<M;j++)44             {45                 sab[k++]=a[i]+b[j];46             }47         sort(sab,sab+k);48 49         cin>>s;50         cout<<"Case "<<con++<<":"<<endl;51         while(s--)52         {53             cin>>q;54             for(j=0;j<N;j++)55             {56                 if(Bi_Search(sab,k,q-c[j]))57                    break;58             }59             if(j==N)60                 cout<<"NO"<<endl;61             else62                 cout<<"YES"<<endl;63         }64     }65     return 0 ;66 }
0 0
原创粉丝点击