题目大意:农场主John的牛喜欢跳房子,它们会从河的这端跳到河的那端,每次只能从相邻的一个石子跳到另一个石子,John想要它们跳的最小距离变得大一些,于是准备移除一些石子(最多只能移除m个),求移除一些石子后,河中的石子的最小间距最大能有多大。
分析:简单二分,水题。。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN=5e4+5;
int dis[MAXN];
int l,n,m;
bool judge(int value){
dis[n]=l;
int pre_rock=0;
int count=0;
for(int i=0;i<=n;++i){
if(dis[i]-pre_rock<value){
++count;
}
else pre_rock=dis[i];
}
return count<=m;
}
void solve(int lb,int rb){
while(lb<rb){
int mid=lb+(rb-lb+1)/2;
if(judge(mid)){
lb=mid;
}
else rb=mid-1;
}
cout<<lb<<endl;
}
int main(){
ios::sync_with_stdio(false);
while(cin>>l>>n>>m){
for(int i=0;i<n;++i){
cin>>dis[i];
}
sort(dis,dis+n);
int min_distance=min(dis[0]-0,l-dis[n-1]);
for(int i=1;i<n;++i){
min_distance=min(min_distance,dis[i]-dis[i-1]);
}
solve(min_distance,l);
}
return 0;
}