10270 : 青蛙的游戏
问题描述
青蛙王国的年度游戏再次开始。 最著名的比赛是铁蛙铁人三项。 铁蛙铁人三项的一项跳跃比赛。 这个项目需要青蛙运动员跳过河。 河的宽度是L(1 <= L <= 1000000000)。 有n(0 <= n <= 100000)个石块排成一条直线。 青蛙过河只能借助于石头。 如果他们掉进河里,他们就出局。 现在要求青蛙最多跳m(1 <= m <= n + 1)次。 现在青蛙想知道要跳过河,他们至少有什么能力。 (即至少具有跳多远的能力)。
输入格式
第一行包含三个正整数L,n和m。
然后接下来n行。 每个代表从开始岸边到第n块石头的距离,两块石头出现在一个地方是不可能的。
输出格式
输出一个整数,代表青蛙至少应该有的能力。
样例输入
25 3 3
11
2
18
样例输出
11
题
本题用2分法
#include <bits/stdc++.h>
using namespace std;
int a[500001],L,n,m,ll,rr,mid,ans;
int check(int k)
{
if(k*m<L) return 1;
int cnt=0,i=1,j=0;
while(i<=n+1)
{
cnt++;
while(i<=n+1&&a[i]-a[j]<=k) i++;
j=i-1;
}
return cnt > m;
}
int main()
{
while(cin>>L>>n>>m)
{
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);
a[0]=0;
a[n+1]=L;
ll=0;
rr=L;
while(ll<=rr)
{
mid=(ll+rr)>>1;
if(check(mid)) ll=mid+1;
else ans=mid,rr=mid-1;
}
cout<<ans<<endl;
}
::::::::::::::::::::::::
}