给你四个集合。要你从这四个集合中
各取出一个数出来,推断,取出的前三个数的和
是否等于第四个数。
数据比較大。我的做法是将
前两个集合全部数全部和的情况取出来,
然后二分查找第四个集合和第三集合取出的数的差值。
我比較懒。用了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 "); break; } } if(p==NULL) printf("NO "); } } int main() { int exp=0; while(scanf("%d%d%d",&num_a,&num_b,&num_c)!=EOF) { printf("Case %d: ",++exp); init(); } }