【NOIP2015提高组】跳石头
https://www.luogu.org/problem/show?pid=2678
最小值最大问题,二分答案。每次检查是否能仅移走m块岩石使得所有跳跃距离均大于等于mid。
#include <iostream> #include <list> #define maxn 50005 const int inf = 0x7fffffff; using namespace std; int l, n, m; int dist[maxn]; bool check(int k); int main() { cin >> l >> n >> m; for (int i = 1; i <= n; i++) cin >> dist[i]; dist[++n] = l; int left = 0, right = 1000000005, mid; while (left < right) { mid = (left + right + 1) / 2; if (check(mid)) // 能否仅通过移去m块石头使所有跳跃距离≥mid left = mid; else right = mid - 1; } cout << left << endl; return 0; } bool check(int k) { int cnt = 0; int last = 0; for (int i = 1; i <= n; i++) { if (dist[i] - dist[last] < k) cnt++; else last = i; if (cnt > m) return false; } return true; }