http://acm.hdu.edu.cn/showproblem.php?pid=2141
两个坑点:
1,如何想到用二分。先计算两个数组任意两个数之和,生成新数组。目标值减去任意数组中的元素在另一个数组中查找是否存在
2,在元素多的数组中用二分
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
using namespace std;
#define N 250005
int a[N],b[N],sab[N],c[N];
int bs(int l,int r,int s){
while(l<=r){
int m=(l+r)/2;
if(sab[m]==s)return m;
if(sab[m]>s)r=m-1;
else l=m+1;
}
return 0;
}
int main()
{
int l,m,n,kase=1;
while(~scanf("%d%d%d",&l,&m,&n)){
for(int i=0;i<l;i++)scanf("%d",&a[i]);
for(int i=0;i<m;i++)scanf("%d",&b[i]);
for(int i=0;i<n;i++)scanf("%d",&c[i]);
int cnt=0;
printf("Case %d:\n",kase++);
for(int i=0;i<l;i++){
for(int j=0;j<m;j++){
sab[cnt++]=a[i]+b[j];
}
}
sort(sab,sab+cnt-1);
sort(c,c+n);
int s;scanf("%d",&s);
while(s--){
int x;scanf("%d",&x);
int flag=0;
for(int i=0;i<m;i++){
int tmp=x-c[i];
if(bs(0,cnt,tmp)){
flag=1;
break;
}
}
if(flag)puts("YES");
else puts("NO");
}
}
return 0;
}