P2678 跳石头
题目大意 在 $0$ 到 $L$ 的位置间,有 $N$ 块岩石。若要使得岩石间距最小值最大,允许移除 $M$ 块,求此时间距最小值。 分析 定义函数 $f(x)$,输入为最小值,输出为被移除岩石的个数,实现如下 ll L, N, M, aa[100086]; ll f(ll x) { ll ans = 0; ll l = 0, r = 1; while (r <= N) { if (aa[r] - aa[l] >= x) l = r; else ans++; r++; } return ans; } 显然 $f(x)$ 是单调递减的函数,二分查找即可。 int main() { L = rr(), N = rr(), M = rr(); for (ll i = 1; i <= N; i++) aa[i] = rr(); aa[++N] = L; ll l = 1, r = L; while (l < r) { ll mid = (l + r + 1) >> 1; ll fm = f(mid); if (fm <= M) l = mid; else r = mid - 1; } printf("%lld\n", l); return 0; }