HDU 2141
来源:互联网 发布:医疗软件哪个好 编辑:程序博客网 时间:2024/06/08 08:18
这是一道二分题目,一开始我没有想到怎么做,因为二分都是针对于两个变量啊!而这里有三个变量,真不懂怎么办!后来看了一位大神的博客才发现方法了,就是把任意两个数组加起来,合成一个数组,这样就是两个变量了!这思路太牛逼了!代码如下:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int maxn=505;int a[maxn],b[maxn],c[maxn],d[255555],e[maxn];int l1,r;int num;int cmp(const void *a,const void *b){ return *(int *)a-*(int *)b;}int binary_search(int t){ l1=0; r=num-1; while(l1<=r) { int mid=(l1+r)>>1; if(d[mid]==t) { return 1; } else if(d[mid]>t) { r=mid-1; } else { l1=mid+1; } } return 0;}int main(){ int tcase=0; int i,j; int l,m,n; while(scanf("%d%d%d",&l,&m,&n)!=EOF)//这里太坑爹了,一开始我没加!=EOF就超时了!无语 { for(i=0; i<l; i++) { scanf("%d",&a[i]); } for(i=0; i<n; i++) { scanf("%d",&b[i]); } for(i=0; i<m; i++) { scanf("%d",&c[i]); } int dd=0; for(i=0; i<l; i++) { for(j=0; j<n; j++) { d[dd++]=a[i]+b[j]; } } num=dd; qsort(d,dd,sizeof(d[0]),cmp); qsort(c,m,sizeof(c[0]),cmp); int s; int flag; scanf("%d",&s); printf("Case %d:\n",++tcase); while(s--) { flag=0; int k; scanf("%d",&k); for(i=0; i<m; i++) { int p; p=k-c[i]; if(binary_search(p)) { flag=1; printf("YES\n"); break; } } if(flag==0) { printf("NO\n"); } } } return 0;}