Give you three sequences of numbers A, B, C, then we give you a number X. Now you need to calculate if you can find the three numbers Ai, Bj, Ck, which satisfy the formula Ai+Bj+Ck = X.
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 <iostream> #include<stdio.h> #include <algorithm> using namespace std; const int N = 505; __int64 ab[N * N]; int num; int search(__int64 x) //二分搜索 { int f = 0, l = num - 1; //f是头,l是尾 int mid; while(f <= l) { mid = (f + l) / 2; if(ab[mid] == x) return 1; else if(ab[mid] < x) f = mid + 1; else l = mid - 1; } return 0; } int main() { int n, m, l, flag = 0, s; __int64 a[N], b[N], c[N], x; while(cin >> n >> m >> l) { flag++;//flag代表第几组测试数据 num = 0; for(int i = 0; i < n; i++) scanf("%I64d", &a[i]); for(int i = 0; i < m; i++) scanf("%I64d", &b[i]); for(int i = 0; i < l; i++) scanf("%I64d", &c[i]); for(int i = 0; i < n; i++) //用二重循环,三重循环会超时。判断A+B=X-C for(int j = 0; j < m; j++) ab[num++] = a[i] + b[j]; sort(ab, ab+num);//对A+B排序 sort(c, c+l);//对C排序 scanf("%d", &s);//要计算S个数 printf("Case %d:\n", flag); while(s--) { scanf("%I64d", &x); if(x < ab[0] + c[0] || x > ab[num-1] + c[l-1]) //X如果不在范围内,则直接退出 printf("NO\n"); else //X在范围内 { __int64 p; int j; for(j = 0; j < l; j++) { p = x - c[j]; //P=X-C[J]=A+B if(search(p)) //二分查找A+B的和等于X的 { printf("YES\n"); break; } } if(j == l) //找到尾部没找到 printf("NO\n"); } } } return 0; }