hdu2141Can you find it?

Posted gavanwanggw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu2141Can you find it?相关的知识,希望对你有一定的参考价值。

??

给你四个集合。要你从这四个集合中

各取出一个数出来,推断,取出的前三个数的和

是否等于第四个数。

数据比較大。我的做法是将

前两个集合全部数全部和的情况取出来,

然后二分查找第四个集合和第三集合取出的数的差值。

我比較懒。用了stl中的bsearch实现二分查找。

代码例如以下:

#include<iostream>
#include<cstdlib>
using namespace std;
int num_a,num_b,num_c,a[510],b[510],c[510],ab[250010];
int cmp(const void *a,const void *b)
{
	return *(int *)a - *(int *)b;
}
void init()
{
	int num_x,x,*p,tmp;
	for(int i=0;i<num_a;i++)
		scanf("%d",&a[i]);
	for(int i=0;i<num_b;i++)
		scanf("%d",&b[i]);
	for(int i=0;i<num_a;i++)
		for(int j=0;j<num_b;j++)
			ab[i*num_b+j]=a[i]+b[j];
	for(int i=0;i<num_c;i++)
		scanf("%d",&c[i]);
	qsort(ab,num_a*num_b,sizeof(int),cmp);
	scanf("%d",&num_x);
	while(num_x--)
	{
		scanf("%d",&x);
		for(int i=0;i<num_c;i++)
		{
			tmp=x-c[i];
			p=(int*)bsearch(&tmp,ab,num_a*num_b,sizeof(int),cmp);
			if(p!=NULL)
			{
				printf("YES\n");
				break;
			}
		}
		if(p==NULL)
			printf("NO\n");
	}
}
int main()
{
	int exp=0;
	while(scanf("%d%d%d",&num_a,&num_b,&num_c)!=EOF)
	{
		printf("Case %d:\n",++exp);
		init();
	}
}

以上是关于hdu2141Can you find it?的主要内容,如果未能解决你的问题,请参考以下文章

HDU 2141 Can you find it?(二分)

HDU 2141 Can you find it? 二分查找

HDU 2141 Can you find it? (二分)

HDU - 2141 Can you find it?(二分)

HDU 2141 can you find it 二分

hdoj-2141-Can you find it?