二分: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; }