HDU 1241 Can you find it? (二分查找)

开始的思路是将A+B枚举,然后二分求X-A-B,这样超时了。

后来发现了一种更加巧妙的思路:先将A+B求和后排序,然后二分求X-c,此处将高效的二分用于求数量更大的A+B。果然换个角度,效率提高了N倍。

#include <stdio.h>
#include <algorithm>
#define maxn 500
using namespace std;
__int64 a[maxn],b[maxn],c[maxn],hun[maxn*maxn];
__int64 L,N,M,num;
bool bs(__int64 v)
{
	__int64 l,r,m;
	l=0;r=num;
	while(l<r)
	{
		m=(l+r)>>1;
		if(hun[m]==v)		return true;
		if(hun[m]<v)	l=m+1;
		else	r=m;
	}	
	return false;
}
bool search(__int64 x)
{
	__int64 i,j,k,t;
	for(i=0;i<M;i++)
	{
		t=x-c[i];
		if(t<hun[0] || t>hun[num-1])	continue;
		if(bs(t))
			return true;	
	}	
	return false;
}
int main()
{
	__int64 i,j,Q,X,ncase=1;
	while(scanf("%I64d%I64d%I64d",&L,&N,&M)==3)
	{
		for(i=0;i<L;i++)
			scanf("%I64d",&a[i]);
		for(i=0;i<N;i++)
			scanf("%I64d",&b[i]);
		for(i=0;i<M;i++)
			scanf("%I64d",&c[i]);
		num=0;
		for(i=0;i<L;i++)
		for(j=0;j<N;j++)
		{
			hun[num++]=a[i]+b[j];	
		}
		sort(hun,hun+num);
		sort(c,c+M);
		scanf("%I64d",&Q);
		printf("Case %I64d:\n",ncase++);
		while(Q--)
		{
			scanf("%I64d",&X);
			if(X>hun[num-1]+c[M-1] || X<hun[0]+c[0]){
				printf("NO\n");
				continue;
			}
			if(search(X))
				printf("YES\n");
			else printf("NO\n");
		}
	}
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值