hdu 2141

来源:互联网 发布:阿里巴巴小二 淘宝天下 编辑:程序博客网 时间:2024/05/14 04:43
本题要求在三个数组中判断能否找出三个数的和与输入的值相等!转化:用一个二重呢循环记录两个数组的中所有可能出现的和的情况,用一个循环将输入的那个数值减去数组中的值,再用二分查找法在第三个数组中查找该差,若查到输出YES否则NO;#include<stdio.h>#include<stdlib.h>#define N 550int a[N],b[N],c[N],sum[N*N];int cmp(const void *a,const void *b){return *(int*)a-*(int*)b;}int main(){int l,n,m,i,j,k,q,t,s,low,high,mid,cnt=1;while(scanf("%d%d%d",&l,&n,&m)!=EOF){for(i=1;i<=l;i++)scanf("%d",&a[i]);for(i=1;i<=n;i++)scanf("%d",&b[i]);for(i=1;i<=m;i++)scanf("%d",&c[i]);k=0;for(i=1;i<=l;i++)for(j=1;j<=n;j++)sum[k++]=a[i]+b[j];qsort(sum,k,sizeof(sum[0]),cmp);scanf("%d",&q);printf("Case %d:\n",cnt++);while(q--){scanf("%d",&s);for(i=1;i<=m;i++){t=s-c[i];low=0;high=k-1;while(low<=high){mid=(low+high)>>1;if(sum[mid]==t)break;else if(t<sum[mid])high=mid-1;elselow=mid+1;}if(low<=high)break;}if(i==m+1)printf("NO\n");elseprintf("YES\n");}}return 0;}

0 0
原创粉丝点击