首页 > 代码库 > hdu2141Can you find it?

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