题目大意
在 $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;
}