HUD2217 - Visit 贪心+排序+暴力

28 篇文章 0 订阅
22 篇文章 0 订阅

1.题目描述:

Visit

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 855    Accepted Submission(s): 286


Problem Description
Wangye is interested in traveling. One day, he want to make a visit to some
different places in a line. There are N(1 <= N <= 2000) places located at points x1, x2, ..., xN (-100,000 ≤ xi ≤ 100,000). Wangye starts at HDU (x = 0), and he travels 1 distance unit in 1 minute . He want to know how many places he could visit at most, if he has T (1 <= T <= 200000 ) minutes.
 

Input
The input contains several test cases .Each test case starts with two number N and T which indicate the number of places and the time respectively. Then N lines follows, each line has a number xi indicate the position of i-th place.
 

Output
For each test case, you should print the number of places,Wangye could visit at most, in one line.
 

Sample Input
  
  
5 16 -3 -7 1 10 8
 

Sample Output
  
  
4
Hint
In the sample, Wangye could visit (-3) first, then goes back to (0), which costs him 6 minutes. Then he visits (1), (8), (10). So he could visit 4 places at most in 16 minutes. :
 

Author
zjt
 

Recommend
lcy   |   We have carefully selected several similar problems for you:   2571  2670  1158  2182  2059 
2.题意概述:

给你N个坐标,初始的时候主人公位于点0处,所有点位于坐标轴上,问在时间T限制内,最多能够访问多少个点。一秒钟移动一个单位距离。

3.解题思路:

首先将N个点的坐标进行排序,然后设定l【】,表示坐标为负数的集合,设定r【】,表示坐标为正的集合,对应l【i】<l【i+1】(按照排序处理),同理r【i】<r【i+1】。
然后,暴力处理,不难分析出其有两种走法,暴力枚举一下,复杂度N方:
①选一个点,作为走到的左边的最远点,然后折返 ,向右走到时间耗用结束为止,维护过程中,最大值。
②选一个点,作为走到的右边的最远点,然后折返,向左走到时间耗用结束为止,维护过程中,最大值。

4.AC代码:

#include <stdio.h>
#include <string.h>
#include <cmath>
#include <algorithm>
#define maxn 22222
using namespace std;
int p[maxn], l[maxn], r[maxn];
int main()
{
	int n, t;
	while (scanf("%d%d", &n, &t) != EOF)
	{
		memset(l, 0, sizeof(l));
		memset(r, 0, sizeof(r));
		for (int i = 0; i < n; i++)
			scanf("%d", &p[i]);
		sort(p, p + n);
		int cnt1 = 0, cnt2 = 0;
		for (int i = 0; i < n; i++)
		{
			if (p[i] < 0)
				l[cnt1++] = p[i];
			else
				r[cnt2++] = p[i];
		}
		int ans = 0;
		for (int i = 0; i < cnt1; i++)
		{
			int cnt = cnt1 - i;
			int time = t + 2 * l[i];
			if (time < 0)
				continue;
			for (int j = 0; j < cnt2; j++)
			{
				int use = 0;
				if (j == 0)
					use = r[j];
				else 
					use = r[j] - r[j - 1];
				if (time > 0 && use <= time)
				{
					time -= use;
					cnt++;
				}
				else 
					break;
			}
			ans = max(ans, cnt);
		}
		for (int i = 0; i < cnt2; i++)
		{
			int cnt = i + 1;
			int time = t - r[i] * 2;
			if (time < 0)
				continue;
			for (int j = cnt1 - 1; j >= 0; j--)
			{
				int use = l[j + 1] - l[j];
				if (time > 0 && time >= use)
				{
					time -= use;
					cnt++;
				}
				else 
					break;
			}
			ans = max(ans, cnt);
		}
		printf("%d\n", ans);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值