二分最小的能力值,然后对该值进行判断,看是否能至多m步跳到河对岸
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int a[500055];
int L,n,m;
int maxn;
int check(int v){
int num=0;
int i=0;
int pos=1;
while(1){
if(a[i]+v>=a[pos]){
pos++;
if(a[i]+v>=L){
num++;
break;
}
}
else{
if(i+1==pos)
break;
num++;
i=pos-1;
}
}
return a[i]+v>=L?num:-1;
}
int main(){
while(scanf("%d%d%d",&L,&n,&m)!=EOF){
maxn=-1;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
a[n+1]=L;
sort(a,a+2+n);
for(int i=1;i<=n+1;i++){
maxn=max(maxn,a[i]-a[i-1]);
}
int l=maxn,r=L;
while(l<r){
int mid=(l+r)/2;
if(check(mid)>m||check(mid)==-1){
l=mid+1;
}
else{
r=mid;
}
}
printf("%d\n",l);
}
return 0;
}