HDU 2141 二分

来源:互联网 发布:商务印书馆 知乎 编辑:程序博客网 时间:2024/05/16 13:43

下午练习一下二分吧,感觉写得很挫....
用A和B两个数组的和作为一个附加数组,求Ai+Bj+Ck=X只需要去搜索A+B的和为X-Ck即可....

#include<iostream>#include<string.h>#include<cstdio>#include<algorithm>using namespace std;int sum[255555];bool cmp( int a,int b ){ return a<b; }int X,Y,Z,T;int N=1;int A[555],B[555],C[555];int len;bool BinarySeach( int k ){  int l=0,r=len-1,m;  while( l<=r )  {  m=(l+r)/2;  if( sum[m]==k ) return true;else{ if( sum[m]>=k ) r=m-1; else l=m+1; } } return false;}int main(){ while( scanf("%d%d%d",&X,&Y,&Z)!=EOF ) {    for( int i=0;i<X;i++ ) scanf( "%d",&A[i] );    for( int i=0;i<Y;i++ ) scanf( "%d",&B[i] );    for( int i=0;i<Z;i++ ) scanf( "%d",&C[i] );       len=0;    for( int i=0;i<X;i++ )    for( int j=0;j<Y;j++ )    sum[len++]=A[i]+B[j];        sort( sum,sum+len,cmp );        scanf( "%d",&T );    printf( "Case %d:\n",N++ );    while( T-- )    {     int XX;     bool found=false;     scanf( "%d",&XX );          for( int i=0;i<Z&&!found;i++ )        if( BinarySeach(XX-C[i]) )           found=true;                if( found==true ) printf( "YES\n" );     else printf( "NO\n" );     }  }  return 0;}


原创粉丝点击