题意:奶牛跳房子,从n块石头中移除M块,使得间距最小的最大值?
思路:“转换”
- 从N块中选择n-m块使得两两之间的间距尽可能大
- c(d) 是间距最大的满足条件,即第一块 放在 xi的位置 下一块就要放在 xj-xi>=d的位置
解决问题的代码:
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int x[500001]; int l, n, m; bool solve(int d) { int last = 0; for (int i = 1; i < n - m; i++) { int cur = last + 1; while (cur < n&&x[cur] - x[last] < d) { cur++; } if (cur == n) return false; last = cur; } return true; } int main() { scanf("%d%d%d", &l, &n, &m); for (int i = 1; i <= n; i++) scanf("%d", &x[i]); ++n; x[n] = l; ++n; sort(x, x + n); int lb = 0, ub = l + 1; while (ub - lb > 1) { int mid = (ub + lb) / 2; if (solve(mid)) lb = mid; else ub = mid; } printf("%d ", lb); return 0; }