Can you find it?
Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others)Total Submission(s): 23753 Accepted Submission(s): 6012
Problem Description
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.
Input
There 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.
Output
For 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
Sample Output
Case 1: NO YES NO#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> using namespace std; long long a[510],b[510],c[510],ans[510*510]; int main() { int l , n ,m , i ,k , j , falg = 1 , s; while(~scanf("%d%d%d",&l,&n,&m)) { int g = 0; for( i = 1 ; i <= l ; i++) scanf("%lld",&a[i]); for( j = 1 ; j <= n ; j++) scanf("%lld",&b[j]); for( k = 1 ; k <= m ; k++) scanf("%lld",&c[k]); for( i = 1 ; i <= l ; i++) for(j = 1 ; j <= n ; j++){ ans[++g] = a[i] + b[j]; } sort(ans+1,ans+g+1); scanf("%d",&s); printf("Case %d:\n",falg++); while(s--) { long long num; bool node = false; scanf("%lld",&num); for( i = 1 ; i <= m ; i++) { int l = 1 , r = g; while( l <= r) { int mid = (l + r) / 2; if(ans[mid] + c[i] == num) { node = true; break; } else if(ans[mid] + c[i] < num) { l = mid + 1; } else r = mid - 1; } if(node) break; } if(node) printf("YES\n"); else printf("NO\n"); } } return 0; }