题目:
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
题目大意:
给出三组数字,要求判断指定数字能否由三组数字中各取一个相加得到。
解题思路:
先将前两组数组相加组合成一个新的数组,时间复杂度是O(n2),然后依次枚举第三个数组中的数字,在新数组中二分查找。
代码:
#include <iostream>
#include <algorithm>using namespace std;
int main(){
int l,m,n;
int coun=1;
while(cin>>l>>n>>m){
cout<<"Case "<<coun<<':'<<endl;
coun++;
int arr[501]={-1};
int brr[250001]={-1};
int crr[501]={-1};
for(int i=0;i<l;i++)cin>>arr[i];
for(int i=0;i<n;i++){
int b;
cin>>b;
for(int j=0;j<l;j++){
brr[l*i+j]=b+arr[j];
}
}
sort(brr,brr+l*n);
for(int i=0;i<m;i++){
cin>>crr[i];
}
int S;
cin>>S;
for(int i=0;i<S;i++){
int x;
cin>>x;
bool ans=false;
for(int j=0;j<m;j++){
if(binary_search(brr,brr+l*n,x-crr[j])){
ans=true;
break;
}
}
if(ans)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
return 0;
}