http://acm.hdu.edu.cn/showproblem.php?pid=2141
/*在排序后的序列中搜索某个确定的值*/
题目大意:在序列a,b,c中分别找一个值,满足a[i]+b[j]+c[k]=X;
先将a,b合并为ab,然后用二分搜索在数组ab中查找X-c[k];
#include<iostream> #include<stdio.h> #include<string.h> #include<stdlib.h> #define Max 505 using namespace std; int ab[Max*Max],a[Max],b[Max],c[Max]; int L,M,N,S,X,K; int cmp(const void* a,const void* b) { return *(int*)a-*(int*)b; } int search(int p) //二分搜索 { int first=0,last=K-1,middle; while(first<=last){ middle=(last+first)/2; if(ab[middle]==p) return 1; else if(ab[middle]<p) first=middle+1; else last=middle-1; } return 0; } int main() { int i,j,flag=0; while(scanf("%d%d%d",&L,&M,&N)!=EOF){ for(i=0;i<L;i++)scanf("%d",&a[i]); for(i=0;i<M;i++)scanf("%d",&b[i]); for(i=0;i<N;i++)scanf("%d",&c[i]); for(i=0,K=0;i<L;i++){ for(j=0;j<M;j++){ ab[K++]=a[i]+b[j]; } } qsort(ab,K,sizeof(ab[0]),cmp); qsort(c,N,sizeof(c[0]),cmp); scanf("%d",&S); printf("Case %d:\n",++flag); for(i=0;i<S;i++){ scanf("%d",&X); for(j=0;j<N;j++){ if(search(X-c[j])){ printf("YES\n"); break; } } if(j==N) printf("NO\n"); } } return 0; }