[HBUE 月赛第一场] 7-7 青蛙过河

  二分:ios

  所求解的为在恶魔破坏不超过 $M$ 片荷叶时,最短跳跃距离的最大值,此时咱们能够二分该最大值。spa

       设当前跳跃距离为 $x$,在断定过程当中,该距离是否合法,即在破坏小于等于 $M$ 片荷叶时的最短跳跃距离可否达到 $x$,若是能达到,则距离还可更大即 $l = x$(恶魔还能破坏),不然该距离没法达到 $r = x - 1$(恶魔不可破坏),不断二分则可获得最优解。code

       注意:blog

       断定过程,可统计可选的点即相邻点大于等于 $x$ 的点的数目,与 $M$ 进行比较便可。ci

#include <iostream>
using namespace std;

const int N = 50010;
int L, n, m;
int a[N];

bool check(int dist)
{
    int cnt = 0;
    int last = 0;
    for (int i = 0; i < n; ++i) {
        if (a[i] - last >= dist) cnt++, last = a[i]; // 统计可行点的个数,不可行则被剔除    
    }
    return cnt >= n - m;
}

int main()
{
    cin >> L >> n >> m;
    for (int i = 0; i < n; ++i) cin >> a[i];
    
    int l = 0, r = L;
    while (l < r) { // 二分最短跳跃距离的最大值
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid; // 距离能够更大,由于恶魔还可损坏 
        else r = mid - 1; // 距离过大,由于恶魔已超过自身可以损坏的数目
    }
    cout << l << endl;
    return 0;
}
相关文章
相关标签/搜索