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);
}
}
看题的时候终于有了点二分的想法,不过分的方式不太对,看过题解后才写出来,非常好的二分题