跳石头(最小最大问题)

跳石头(最小最大问题)_第1张图片
跳石头(最小最大问题)_第2张图片
跳石头(最小最大问题)_第3张图片

思路:二分法查找最短距离的最长值
	查找范围:1---l
分析:
1,取最短距离为mid,然后判断这个mid能否满足另一个条件
2,判断mid :
	遍历a[],与学校灭路灯问题类似处理,
	相邻两块石头距离小于mid的情况不能大于m即成立,
	否则此mid不成立。(即我撤走m块石头能干掉所有距离比mid小的情况)
总结:最短最长,最长最短,最大最小,最小最大问题一般用二分搞定。
#include 
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;
}

你可能感兴趣的:(蓝桥杯--第十章--二分查找)