二分- 青蛙游戏

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 332  Solved: 137
[Submit][Status][Web Board]

Description

青蛙王国运动会开始了,最受欢迎的游戏是铁蛙三项赛,其中一项是跳跃过河项目。这个项目需要青蛙运动员通过跳跃过河。河的宽度是L。在河面上有直线排列的n个石头。青蛙可以利用这些石头跳跃过河,如果落入河中则失败。青蛙们能够跳跃的最多次数是m。现在铁蛙门想要知道他们至少需要具备多大的跳跃距离,才能够顺利完成比赛。

Input

输入包含了多个测试样例,测试样例第一行包含了3个正整数L,n,m。接下来的i(i<=n)行中,第i表示第i个石头距离起跳岸边的距离,其中不存在两个石头距离相同的情况。

Output

输出一个整数,表示铁蛙要完成比赛需要具备的最低跳跃能力。

Sample Input

6 1 2 2 25 3 3 11 2 18

Sample Output

4 11

#include<stdio.h>
#include<algorithm>
using namespace std;
int a[100005];
int L,n,m;
int judge(int x)
{
	int los=0;//标记落地位置 
	int num=0;//纪录步数 
	for(int i=1;i<=n+1;i++)
	{
		if(a[i]-a[los]<=x&&a[i+1]-a[los]>x)
		{
			los=i;
			num++;
		}
		if(a[i]-a[los]>x)
		{
			return 0;
		}
	}
	num++;
	if(num>m)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}
int main()
{
	while(scanf("%d%d%d",&L,&n,&m)!=EOF)
	{
		a[0]=0;
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
		}
		sort(a,a+n+1);
		a[n+1]=L;
		int r=L;
		int l=0;
		int mid;
		while(l<=r)//二分寻找答案 
		{
			mid=(r+l)/2;
			if(judge(mid))
			{
				r=mid-1;
			}
			else{
				l=mid+1;
			}
		}
		printf("%d\n",l);
	}
}

看题的时候终于有了点二分的想法,不过分的方式不太对,看过题解后才写出来,非常好的二分题

猜你喜欢

转载自blog.csdn.net/s_h_w_s_n_g/article/details/84727608