40pts
查看原帖
40pts
1013950
__youzimo2014__楼主2024/11/12 20:22

record.

#include <bits/stdc++.h>
using namespace std;
int l, n, m, w[50005];
bool check(int x) {
	int cnt = 0; // 需要拿走的石头个数 
	for (int i = 1; i <= n; i++) {
		int dis = w[i]-w[i-1], begin = i-1; 
		if (dis < x) { // 拉开 begin 到下一块没拿走的石头的距离 
			while (i <= n) { // 考虑拿走第 i+1 块石头 
				cnt++; 
				if (dis+(w[i+1]-w[i]) >= x) { // 拿走第 i+1 块石头可以满足条件 
					i++; break; 
					// 由于第 i+1 块石头要被拿走,所以下一次要从 i+2 开始拿。
					// 至于为什么不是 i += 2,因为最大的 for 循环结束之后会 i++ 
				}
				if (dis+(w[begin+1]-w[begin]) >= x) break; 
				// 不拿走第 i+1 块石头,直接拿走第 begin+1 块石头,看看可不可以满足条件。 
				dis += w[i]-w[i-1];
				i++;
			}
			if (i > n) return false;
		}
	}
	return cnt <= m;
}
int main () {
	cin >> l >> n >> m;
	for (int i = 1; i <= n; i++)  {
		cin >> w[i];
	}
	w[n+1] = l;
	int lft = 0, rig = l, ans = 0;
	while (lft <= rig) {
		int mid = (lft + rig) / 2;
		if (check(mid)) {
			ans = mid;
			lft = mid + 1;
		} else {
			rig = mid - 1;
		}
	}
	cout << ans << endl;
	return 0;
}

2024/11/12 20:22
加载中...