题目描述
这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 N 块岩石(不含起点和终点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达终点。
为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳跃距离尽可能长。由于预算限制,组委会至多从起点和终点之间移走 M 块岩石(不能移走起点和终点的岩石)。
题目解析
这题很明显要用二分答案来求解。
二分的答案 m i d mid mid,对于搬走哪些石头,每次挑选与前面距离小于 m i d mid mid的石头,并需要更新后面一个石头与前面石头的距离。
代码
#include<bits/stdc++.h>
#define N 50005
#define ll long long
using namespace std;
ll l,n,m,ans;
ll a[N];
bool check(ll x)
{
ll cnt=0;
ll b[N];
for(int i=1;i<=n;i++)
b[i]=a[i]-a[i-1];
for(int i=1;i<=n;i++)
if(b[i]<x)
cnt++,b[i+1]+=b[i];
return cnt>m;
}
int main()
{
scanf("%lld%lld%lld",&l,&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
ll la=0,ra=l,mid;
while(la<=ra)
{
mid=(la+ra)/2;
if(check(mid)) ra=mid-1;
else la=mid+1,ans=mid;
}
cout<<ans;
}