您的位置:首页 > 其它

HDU 2141 Can you find it? 二分查找

2015-07-29 19:35 369 查看
原题: http://acm.hdu.edu.cn/showproblem.php?pid=2141

题目:

Can you find it?

Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others)

Total Submission(s): 17902 Accepted Submission(s): 4515

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

思路:

四个数组,a,b,c,x。

第一排分别输入a的元素个数,b的元素个数,c的元素个数。

后面三排输入abc分别有哪些元素。

后面一排输入x的元素个数。

后面则输入x分别有哪些元素。

暴力解法就是三重for循环,枚举所有情况是否满足和等于x。

显然,500*500*500*1000是要超时的。

因为a+b+c=x,变形可得a+b=x-c,虽然感觉这并没有什么用,但是请注意内存限制,10 000kb,而500*500*500是125 000 kb,内存超出限制。

而我们变形之后,左边是250kb,右边是500kb,不会超出内存限制。

处理完空间后,时间也会超时,因为我们需要寻找的是两边能否找出相等值,对于右边的每一个值,左边只需要用二分查找,需要用的时间是500*1000*log250000 大概等于10^7,并不会超时。

代码:

#include <iostream>
#include"string.h"
#include"cstdio"
#include"stdlib.h"
#include"algorithm"
using namespace std;

const int N = 505;
int l,n,m;
int a
;
int b
;
int c
;
int ab[N*N];
int ff[1005];
int flag[1005];
int f;
int cishu=1;
void init()
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(ab,0,sizeof(ab));
memset(ff,0,sizeof(ff));
memset(flag,0,sizeof(flag));
}
void input()
{
for(int i=1; i<=l; i++)
{
scanf("%d",&a[i]);
}
for(int i=1; i<=n; i++)
{
scanf("%d",&b[i]);
}
for(int i=1; i<=m; i++)
{
scanf("%d",&c[i]);
}
scanf("%d",&f);
for(int i=1;i<=f;i++)
{
scanf("%d",&ff[i]);
}

}

void func()
{
int k=0;
for(int i=1;i<=l;i++)
{
for(int j=1;j<=n;j++)
{
ab[k]=a[i]+b[j];
k++;
}
}
sort(ab,ab+k);
for(int i=1;i<=f;i++)
{
for(int j=1;j<m;j++)
{
int temp=ff[i]-c[j];
int pos=lower_bound(ab,ab+k,temp)-ab;
if(ab[pos]==temp)
{
flag[i]=1;
break;
}
}
}
}

void print()
{
printf("Case %d:\n",cishu);
cishu++;
for(int i=1;i<=f;i++)
{
if(flag[i])
printf("YES\n");
else
printf("NO\n");
}
}

int main()
{
while(scanf("%d %d %d",&l,&n,&m)!=EOF)
{
init();
input();
func();
print();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: