现在的位置: 首页 > 综合 > 正文

HDU/HDOJ 2141 Can you find it?

2017年11月22日 ⁄ 综合 ⁄ 共 1700字 ⁄ 字号 评论关闭

 

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
 

 

Author

 

wangye

这个题,直接O(n^3)肯定超时

仔细一想发现可以把时间降到O(n^2*logn)

但是我在实现的时候没实现好。还是超时了两次。

 

具体思路自然是先把a[i]+b[j]的所有情况存起来,存到sum数组里面

然后每次查找x-c[i]是否在sum中出现就OK

 

比较有意思的题目。

我的代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>

using namespace std;

int a[505],b[505],c[505];
int sum[505*505];
int l,n,m,k;

bool judge(int x)
{
	int left,right,mid;
	left=1,right=k;
	while(left<=right)
	{
		mid=(left+right)>>1;
		if(sum[mid]>x)
			right=mid-1;
		else if(sum[mid]<x)
			left=mid+1;
		else
			return true;
	}
	return false;
}

int main()
{
	int i,j,q,x,cnt=1;
	while(scanf("%d%d%d",&l,&n,&m)!=EOF)
	{
		for(i=1;i<=l;i++)
			scanf("%d",&a[i]);
		for(i=1;i<=n;i++)
			scanf("%d",&b[i]);
		for(i=1;i<=m;i++)
			scanf("%d",&c[i]);
		k=0;
		for(i=1;i<=l;i++)
			for(j=1;j<=n;j++)
			{
				k++;
				sum[k]=a[i]+b[j];
			}
		sort(sum+1,sum+k+1);
		scanf("%d",&q);
		printf("Case %d:\n",cnt++);
		while(q--)
		{
			scanf("%d",&x);
			bool flag=true;
			for(i=1;i<=m;i++)
			{
				if(judge(x-c[i]))
				{
					flag=false;
					printf("YES\n");
					break;
				}
			}
			if(flag)
				printf("NO\n");
		}
	}
	return 0;
}

 

抱歉!评论已关闭.