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思路:先将前两组数据分别相加,得到一个新数组,对新数组排序,再二分与第三个数组相加,看是否有解1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60#include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; const int M=510; __int64 a[M],b[M],c[M]; __int64 num[M*M]; int main() { int l,n,m,t,s,test=1; while(~scanf("%d%d%d",&l,&n,&m)) { for(int i=1;i<=l;i++) scanf("%I64d",&a[i]); for(int i=1;i<=n;i++) scanf("%I64d",&b[i]); for(int i=1;i<=m;i++) scanf("%I64d",&c[i]); t=0; for(int i=1;i<=l;i++) { for(int j=1;j<=n;j++) { num[++t]=a[i]+b[j];//前两组数相加 } } sort(num+1,num+t+1); __int64 x; scanf("%d",&s); printf("Case %d:\n",test++); while(s--) { scanf("%I64d",&x); bool sine=false; for(int i=1;i<=m;i++) { int k=1,r=t; while(k<=r) { int mid=(r+k)/2; if(num[mid]+c[i]==x) { sine=true; break; } else if(num[mid]+c[i]<x) k=mid+1; else r=mid-1; } if(sine) break; } if(sine) printf("YES\n"); else printf("NO\n"); } } return 0; }