暴力的话n^3肯定会超时,如果遍历两个数组,然后二分查找另一个数组也会超时,所以这道题应该先让两个数组相加,然后遍历第三个数组,二分查找这新数组。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[505],c[505],b[505],pre[505*505];
int l,n,m,num,flag,Case;
int main()
{
Case = 1;
while(~scanf("%d%d%d",&l,&n,&m)){
for(int i=0;i<l;i++)scanf("%d",&a[i]);
for(int i=0;i<n;i++)scanf("%d",&b[i]);
for(int i=0;i<m;i++)scanf("%d",&c[i]);
num = 0;
for(int i=0;i<l;i++){
for(int j=0;j<n;j++){
pre[num++] = a[i] + b[j];
}
}
sort(pre,pre+num);
int T;
scanf("%d",&T);
printf("Case %d:\n",Case++);
while(T--){
flag = 0;
int ans;
scanf("%d",&ans);
for(int i=0;i<m;i++){
int l=0,r=num-1,mid;
while(l<=r){
mid = (l+r)/2;
if(pre[mid] + c[i] == ans){
flag = 1;
break;
}
else if(pre[mid] + c[i] < ans){
l = mid + 1;
}
else r = mid - 1;
}
if(flag)break;
}
if(flag)printf("YES\n");
else printf("NO\n");
}
}
return 0;
}