hdu 2141 二分搜索

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;

}


 

 

你可能感兴趣的:(HDU)