题目链接
经典的二分问题,先处理了第一块和最后一块岩石
因为距离从1到l都可以,所以想到用二分
对于当前的距离mid,如果cnt>=N+2-M,说明di选小了;(意思是mid距离需要多少块岩石)
如果cnt<N+2-M,说明di选大了;
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=50010;
const int mod=1e9;
int l,n,m,ans;
int a[N];
int read(){
char c;
int sign=1;
while((c=getchar())<'0'||c>'9'){
if(c=='-') sign=-1;
}
int res=c-'0';
while((c=getchar())>='0'&&c<='9'){
res=res*10+c-'0';
}
return res*sign;
}
bool check(int mid){
int last=-INF,cnt=0;
for(int i=0;i<=n+1;i++){
if(a[i]>=last+mid){
cnt++;
last=a[i];
}
}
return cnt>=n+2-m;
}
int main(){
l=read(),n=read(),m=read();
int r=l;
l=0;
a[0]=0,a[n+1]=r;
for(int i=1;i<=n;i++){
a[i]=read();
}
sort(a,a+n+2);
while(l<=r){
int mid=(l+r)>>1;
if(check(mid)){
ans=mid;
l=mid+1;
}else{
r=mid-1;
}
}
cout<<ans<<endl;
}