Can you find it?Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others)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".
|
思路:
最容易想到的是三重for遍历 ,但商品数最大 = 500,红包数最多 = 1000;但1e3*500^3 必然超时;
二分,先确定两个,再用二分查找第三个,1e3*500^2 = 2.5e8 超时;
因此这里我的办法是先将一组数的所有数和另一组数的所有数两两相加,存到一个数组sum里,最多:500*500=2.5e5,
最后先确定第三组数里的一个数,用二分查找sum数组,看能否找到一个数使得相加结果为X,
最多运算次数1000*500* log(2.5e5)≈ 7e6
AC代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int RPM = 1005;
const int SM = 505;
bool BS(long long int a[],int size,int tof)
{
int l=0;
int r=size-1;
while(l <= r) {
int mid = l+(r-l)/2;
if(a[mid] == tof)
return true;
else {
if(a[mid] > tof)
r = mid-1;
else
l = mid+1;
}
}
return false;
}
int main()
{
int L,M,N,H;
long long int a[SM],b[SM],c[SM],sum[SM*SM];
int Case = 1;
while(scanf("%d %d %d",&L,&M,&N)!= EOF) {
for(int i=0;i<L;i++)
scanf("%lld",&a[i]);
for(int i=0;i<M;i++)
scanf("%lld",&b[i]);
for(int i=0;i<N;i++)
scanf("%lld",&c[i]);
int k=0;
for(int i=0;i<L;i++)
for(int j=0;j<M;j++)
sum[k++] = a[i] + b[j];
sort(sum,sum+L*M);
printf("Case %d:\n",Case++);
scanf("%d",&H);
while(H--) {
int flag=0;
int Count;
scanf("%d",&Count);
for(int i=0;i<N;i++) {
if( BS(sum,L*M,Count-c[i])) {
flag = 1;
break;
}
}
if( flag)
printf("YES\n");
else
printf("NO\n");
}
}
}