码迷,mamicode.com
首页 > 其他好文 > 详细

hdu2141Can you find it?

时间:2017-04-29 20:03:09      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:hdu   clu   数据   arch   int   size   main   ret   等于   

??

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

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

是否等于第四个数。

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

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

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

我比較懒。用了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   clu   数据   arch   int   size   main   ret   等于   

原文地址:http://www.cnblogs.com/gavanwanggw/p/6785824.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!