跳石头1标准last(时时回顾)

include <bits/stdc++.h>

using namespace std;

// 二分查找函数,用于查找最大最小跳跃距离
int two_k(int left, int right, const vector& arr, int m) {
if (left > right) return right;

int mid = left + (right - left) / 2;
int cnt = 0;
int last = 0; // 上一个保留的岩石位置

// 遍历所有岩石,模拟移除操作
for(int i = 1; i < arr.size(); ++i){
    if(arr[i] - arr[last] < mid){
        cnt++; // 需要移除当前岩石
        if(cnt > m){
            break; // 超过允许移除数量,提前退出
        }
    }
    else{
        last = i; // 保留当前岩石
    }
}

if(cnt > m){
    // 如果需要移除的岩石数量超过了 M,说明 mid 太大
    return two_k(left, mid - 1, arr, m);
}
else{
    // 否则,尝试更大的 mid
    return two_k(mid + 1, right, arr, m);
}

}

int main(){
int l, n, m;
cin >> l >> n >> m;
vector arr;

// 添加起点
arr.push_back(0);

// 读取中间的岩石位置
for(int i = 0; i < n; ++i){
    int num;
    cin >> num;
    arr.push_back(num);
}

// 添加终点
arr.push_back(l);
int ans = two_k(0, l, arr, m);
cout << ans << endl;

return 0;

}

posted @ 2024-12-11 22:46  Qacter  阅读(24)  评论(0)    收藏  举报