Can you find it?
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
题意:有3个数表,从每个表拿出一个数相加能不能得出X。
分析:暴力枚举,O(N^3)爆炸
枚举前两个数,二分第三个O(N^2logN)貌似也可能爆炸。
怎么办?
先处理后两组数字的和O(N^2);排序,去重同时计重复次数O(N^2);之后枚举第一个数,二分后两个数的
O(NlogN)
故复杂度为O(N^2)可以过数据
代码:
#include "iostream"
#include "cstdio"
#include "vector"
#include "algorithm"
#include "fstream"
using namespace std;
int a[505],b[505],c[505];
int sum[505*505];
bool flag;
int x;
bool bs(int a[],int key,int k){
int lo=0,hi=k-1;
int mi;
while (lo<=hi){
mi=((hi-lo)>>1)+lo;
if (a[mi]==key){
flag=true;
return true;
}
else if (a[mi]<key)lo=mi+1;
else hi=mi-1;
}
//flag=false;
return false;
}
int main()
{
int A,B,C;
int total=0;
// freopen("in.txt","r",stdin);
while (scanf ("%d%d%d",&A,&B,&C)!=EOF){
total++;
for (int i=0;i<A;i++){
scanf ("%d",&a[i]);
}
for (int i=0;i<B;i++){
scanf ("%d",&b[i]);
}
for (int i=0;i<C;i++){
scanf ("%d",&c[i]);
}
int len=0;
for (int i=0;i<A;i++){
for (int j=0;j<B;j++){
sum[len++]=a[i]+b[j];
}
}
sort(sum,sum+len);
int S;
scanf ("%d",&S);
int s[S];
for (int i=0;i<S;i++){
scanf ("%d",&s[i]);
}
printf ("Case %d:\n",total);
for (int i=0;i<S;i++){
flag=false;
for (int j=0;j<C;j++){
if (bs(sum,s[i]-c[j],len)){
printf ("YES\n");
break;
}
}
if (!flag)printf ("NO\n");
//else printf ("YES\n");
}
}
}