3 3 3 1 2 3 1 2 3 1 2 3 3 1 4 10
Case 1: NO YES NO
用三个for循环会超时
后来就改进了一下把函数改为:A+B=X-C,然后二分搜一下就可以了;
#include <cstdio> #include <algorithm> using namespace std; const int maxn = 500 + 10; long long ab[maxn * maxn], a[maxn], b[maxn], c[maxn]; long long len; int binary_search(long long kk) { long long fir = 0, las = len - 1; while (fir <= las){ long long middle = (fir + las) / 2; if (ab[middle] == kk) return 1; else if (ab[middle] > kk) las = middle - 1; else fir = middle + 1; } return 0; } int main() { long long l, n, m, s, x; long long ans, flag; ans = 0; while (scanf("%I64d%I64d%I64d", &l, &n, &m) != EOF){ len = 0; for (int i = 0; i < l; i++) scanf("%I64d", &a[i]); for (int i = 0; i < n; i++) scanf("%I64d", &b[i]); for (int i = 0; i < m; i++) scanf("%I64d", &c[i]); for (int i = 0; i < l; i++){ for (int j = 0; j < n; j++){ ab[len++] = a[i] + b[j]; } } sort (ab, ab + len); sort (c, c + m); scanf("%I64d", &s); printf("Case %I64d:\n", ++ans); while (s--){ scanf("%I64d", &x); if (x < ab[0] + c[0] || x > ab[len - 1] + c[m - 1]){ printf("NO\n"); continue; } flag = 0; for (int i = 0; i < m; i++){ long long kk = x - c[i]; if (binary_search(kk)){ flag = 1; break; } } if (flag) printf("YES\n"); else printf("NO\n"); } } return 0; }