[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;
}
相關文章
相關標籤/搜索