暴力的话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;
}