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.
InputThere are many cases. Every data case is described as followed: In the first line there are three integers L, N, M, in the second line there are L integers represent the sequence A, in the third line there are N integers represent the sequences B, in the forth line there are M integers represent the sequence C. In the fifth line there is an integer S represents there are S integers X to be calculated. 1<=L, N, M<=500, 1<=S<=1000. all the integers are 32-integers.
OutputFor each case, firstly you have to print the case number as the form "Case d:", then for the S queries, you calculate if the formula can be satisfied or not. If satisfied, you print "YES", otherwise print "NO".
Sample Input
3 3 3 1 2 3 1 2 3 1 2 3 3 1 4 10
Case 1: NO YES NO
思路:正常遍历肯定爆了,涉及到四层循环。暴力时间严重超时。
可以采用空间换时间的做法,先两层循环计算L,N的数据保存成新数组,再用二分法进行遍历。
#include<cstdio>
#include<iostream>
#include <string>
#include<algorithm>
#include<map>
#include<set>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
int main(void) {
int L,N,M,S;
int LL[501],NN[501],MM[501];
long long LLNN[501*501];
int SS[1001];
int begin,end,mid;
long long sum;
bool check =false;
int ex = 1;
//freopen("main.txt", "r",stdin);
while(~scanf("%d%d%d", &L, &N, &M)) {
printf("Case %d:\n", ex++);
for(int i = 0; i < L; i++) {
scanf("%d", &LL[i]);
}
for(int i = 0; i < N; i++) {
scanf("%d", &NN[i]);
}
for(int i = 0; i < M; i++) {
scanf("%d", &MM[i]);
}
sort(MM, MM+M);
int p = 0;
for(int i = 0; i < L; i++) {
for(int j = 0; j < N; j++ ) {
LLNN[p++] = LL[i] + NN[j];
}
}
sort(LLNN, LLNN + p);
// for(int i = 0; i < p; i++) {
// printf("%d ", LLNN[i]);
//
// }
// printf("\n");
scanf("%d", &S);
for(int i = 0; i < S; i++) {
scanf("%d", &SS[i]);
}
for(int ii = 0; ii < S; ii++) {
check = false;
for(int i = 0; i < M; i++) {
begin = 0;
end = p - 1;
while(begin <= end) {
mid = (begin + end) / 2;
// printf("mid%d\n", mid);
// printf("LLNN %d MM[i] %d sum %d\n",LLNN[mid], MM[i], LLNN[mid] + MM[i]);
if(LLNN[mid] + MM[i] == SS[ii]) {
check = true;
break;
}else if(LLNN[mid] + MM[i] > SS[ii]) {
end = mid - 1;
}else {
begin = mid + 1;
}
}
if(check) {
break;
}
}
if(check) {
printf("YES\n");
}else {
printf("NO\n");
}
}
}
return 0;
}