思路:二分法查找最短距离的最长值
查找范围:1---l
分析:
1,取最短距离为mid,然后判断这个mid能否满足另一个条件
2,判断mid :
遍历a[],与学校灭路灯问题类似处理,
相邻两块石头距离小于mid的情况不能大于m即成立,
否则此mid不成立。(即我撤走m块石头能干掉所有距离比mid小的情况)
总结:最短最长,最长最短,最大最小,最小最大问题一般用二分搞定。
#include <bits/stdc++.h>
using namespace std;
int l,n,m;
int a[50005];
bool check(int mid){
//检查取最短距离为mid是否可以
int sum = 0, now = 0;
for(int i = 1; i <= n; i++){
if(a[i] - a[now] < mid){
sum++; //干掉一块石头++
}else{
now = i;//now更新到当前石头
}
}
return sum <= m;
}
int halfserach(int l,int r){
int ans;
while(l <= r){
int mid = (l + r) / 2;
if(check(mid)){
ans = mid;
l = mid + 1;
}else {
r = mid -1;
}
}
return ans;
}
int main(){
cin >> l >> n >> m;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
cout << halfserach(1,l);
return 0;
}