poj 3258 River Hopscotch 【二分查找(最大化最小值)】

River Hopscotch
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 9527 Accepted: 4075

Description

Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock in a river. The excitement takes place on a long, straight river with a rock at the start and another rock at the end, L units away from the start (1 ≤ L ≤ 1,000,000,000). Along the river between the starting and ending rocks, N (0 ≤ N ≤ 50,000) more rocks appear, each at an integral distance Di from the start (0 < Di < L).

To play the game, each cow in turn starts at the starting rock and tries to reach the finish at the ending rock, jumping only from rock to rock. Of course, less agile cows never make it to the final rock, ending up instead in the river.

Farmer John is proud of his cows and watches this event each year. But as time goes by, he tires of watching the timid cows of the other farmers limp across the short distances between rocks placed too closely together. He plans to remove several rocks in order to increase the shortest distance a cow will have to jump to reach the end. He knows he cannot remove the starting and ending rocks, but he calculates that he has enough resources to remove up to M rocks (0 ≤ MN).

FJ wants to know exactly how much he can increase the shortest distance *before* he starts removing the rocks. Help Farmer John determine the greatest possible shortest distance a cow has to jump after removing the optimal set of M rocks.

Input

Line 1: Three space-separated integers: L, N, and M
Lines 2.. N+1: Each line contains a single integer indicating how far some rock is away from the starting rock. No two rocks share the same position.

Output

Line 1: A single integer that is the maximum of the shortest distance a cow has to jump after removing M rocks

Sample Input

25 5 2
2
14
11
21
17

Sample Output

4

Hint

Before removing any rocks, the shortest jump was a jump of 2 from 0 (the start) to 2. After removing the rocks at 2 and 14, the shortest required jump is a jump of 4 (from 17 to 21 or from 21 to 25).

Source

 
思路:
 
          用二分的方法在0到L+1中查找满足条件的最大化的最小值d,然后输出!
 
           条件是:总共N+2块岩石,你要从中去除M块(去除的M块是使两个岩石之间的距离增大,也就是去除原来的构成最短的距离的岩石),然后求剩余的岩石中两个岩石之间的最小的距离!
 
          方法:其实你不用去除,你直接从N+2个岩石中找N-M+2块岩石,使他们满足最短的距离最大就行了!
 
代码:
 
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int L,N,M;
int a[50005];
int C(int d)
{
	int last=0;//从0号元开始找 
	for(int i=1;i<N-M+2;i++)//总共有N+2个岩石,拿走M个,要放的岩石的个数 为N+2-M 
	{//通过一个点看看有没有满足条件的后一个点 
        int crt=last+1;//last保存一个点,crt保存后一个点 
		while(crt<N+2&&a[crt]-a[last]<d)//总点数为N+1,终点要在这个范围里面 
			crt++;//并且距离小于d,则将终点往后移动,看看有没有和last距离大于等于d的点 
		if(crt==N+2) //如果还没有找到N-M+1个起点,终点就找到头了,那么说明d不满足题意 
			return 0;//也就是说d太大了需要换成较小的 
		last=crt;//否则的话继续找 
	}
	return 1;//如果能够找到N-M+1个点再加上0这个起点总共就够N-M+2了,就满足题意了 
}//但是为了找到最大的满足条件的d值,我们需要用二分的方法来继续查找更大的满足条件的d 
int main()
{
	while(scanf("%d%d%d",&L,&N,&M)!=EOF)
	{
		for(int i=1;i<=N;i++)//输入的是起点和终点之间的点 
		{
			scanf("%d",&a[i]);
		}
		a[0]=0;//起点 
		a[N+1]=L;//终点 
		sort(a,a+N+2);//对a数组进行排序 
		int l=0,r=L+1;//假设两个岩石之间最小的距离为0,最大的距离为L+1(比终点大1) 
		while(r-l>1)//二分查找一个介于0到L-1之间的一个距离为满足条件的距离 
		{
			int mid=(l+r)/2;
			if(C(mid))//当要找的距离太短的时候继续往后找较大的 
				l=mid;
			else//否则找交小的 
				r=mid;
		}
		printf("%d\n",l);//输出最小值 
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值