首页 > 代码库 > 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(); } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。