地址:https://ac.nowcoder.com/acm/contest/5986/E
解析:
二分最短距离,check出它所需要的修改次数。
check里注意,如果需要修改,那么last是不要变的,因为往后的a[i]-last即为去掉中间后的距离。
如果不需要修改,那么last需要变为a[i],因为a[i]之前的石头都已被搬掉,last只能变成a[i]了。
#include <cstdio>
#include<cstring>
#include<map>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=5e4+10;
int l,n,m;
int a[maxn];
bool check(int x)
{
int last=0,cnt=0;
for(int i=1;i<=n+1;i++)
{
if(a[i]-last<x)
cnt++;
else
last=a[i];
}
if(cnt>m)
return false;
return true;
}
int main()
{
cin>>l>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
a[n+1]=l;
int ll=0,rr=l,x;
while(ll<rr)
{
int md=(ll+rr+1)>>1;
if(check(md))
{
// x=md;
ll=md;
}
else
rr=md-1;
}
cout<<rr<<endl;
}