
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiao__jia__jia/article/details/79972967
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; }
查看评论