思路:
二分,分他們之間的差距
:
#include<cstdio>
#include<iostream>
using namespace std;
int L,n,m,mid;//mid是中間值
int a[100001],b[100001];
int check (int jl)//jl是距離
{
int ans = 0;
for (int i = 0; i <= n; ++i) b[i] = a[i];//b[i]充當空瓶子
for (int i = 1; i <= n; ++i)
{
if(b[i] - b[i - 1] < jl) b[i] = b[i - 1],ans++;//替換
if(ans > m) return ans;//返回
}
return ans;
}
int main ()
{
scanf("%d%d%d",&L,&n,&m);
for (int i = 1; i <= n; ++i)
scanf("%d",&a[i]);
n++;//方便下面的初始化
a[0] = 0;a[n]=L;//初始化(左右端點)
int l = 0,r = L;
while(l + 1 < r)//二分模板
{
mid = (l + r) / 2;
if (check(mid) > m)r = mid;
else l = mid ;
}
if(check(r) <= m)printf("%d",r);//答案
else printf("%d",l);
return 0;
}