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