HDU 2141——Can you find it?

来源:互联网 发布:龙岗区数据统筹办公室 编辑:程序博客网 时间:2024/06/13 00:33

二分查找

把a[A]数组和b[B]数组相加,得到ab[A*B]。

然后二分查找。

#include<iostream>#include<algorithm>#include<cstdio>using namespace std;#define maxn 504bool cmp(int a,int b){return a<b;}int main(){int a[maxn];int b[maxn];int ab[maxn*maxn];int c[maxn];int A,B,C;int flag=1;int m;while(cin>>A>>B>>C){int i,j;for(i=0;i<A;i++)cin>>a[i];for(i=0;i<B;i++)cin>>b[i];for(i=0;i<C;i++)cin>>c[i];int k=0;for(i=0;i<A;i++)for(j=0;j<B;j++)ab[k++]=a[i]+b[j];sort(ab,ab+A*B,cmp);sort(c,c+C,cmp);cin>>m;printf("Case %d:\n",flag);while(m--){int x;int f=0;cin>>x;for(i=0;i<C;i++){int l=0,r=A*B-1;int mid=(l+r)/2;while(abs(l-r)>1&&!f){if(x-c[i]>ab[mid])l=mid;elseif(x-c[i]<ab[mid])r=mid;elsef=1;mid=(l+r)/2;}if(f)break;}if(f)printf("YES\n");elseprintf("NO\n");}flag++;}return 0;} 


原创粉丝点击