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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值