http://acm.hdu.edu.cn/showproblem.php?pid=2141
使用二分优化时间复杂度 将a+b的和存在一个250000的数组里。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int L,N,M,a[510],b[510],c[510],sum[250010],S,num;
bool check(int x){
for(int i=1; i<=M; i++){
int key = x - c[i];
int l = 0, r = num - 1;
while(l <= r){
int mid = (l + r) >> 1;
if(sum[mid] > key)
r = mid - 1;
else if(sum[mid] < key)
l = mid + 1;
else
return true;
}
}
return false;
}
int main(){
// freopen("in.txt", "r", stdin);
int t = 0;
while(scanf("%d%d%d",&L,&N,&M) == 3){
t++;
for(int i=1; i<=L; i++) scanf("%d",&a[i]);
for(int i=1; i<=N; i++) scanf("%d",&b[i]);
for(int i=1; i<=M; i++) scanf("%d",&c[i]);
num = 0;
for(int i=1; i<=L; i++){
for(int j=1; j<=N; j++){
sum[num++] = a[i] + b[j];
}
}
sort(sum, sum+num);
scanf("%d",&S);
cout << "Case " << t << ":" << endl;//一直没看到有这个WA了好几次
int x;
for(int i=1; i<=S; i++){
scanf("%d",&x);
if(check(x)) puts("YES");
else puts("NO");
}
}
return 0;
// int i;
// float j;
// scanf("%d%f",&i,&j);
// printf("%d %f",i,j);
}