题目大意

在 $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;
}