下午练习一下二分吧,感觉写得很挫....
用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;
}