社区讨论

二分答案 60pts,求 hack

P4447[AHOI2018初中组] 分组参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mlit5br6
此快照首次捕获于
2026/02/12 09:56
上周
此快照最后确认于
2026/02/14 14:50
5 天前
查看原帖
已通过讨论区所有 hack。
CPP
int n, a[N];
bool check(int x) {
	multiset<int> st(a + 1, a + n + 1);
	multiset<int> q1;
	vector<int> q2;
	while (!st.empty()) {
		int v = *st.begin(), p = -1;
		for (int i = v; i <= v + x - 1; i++) {
			if (st.find(i) == st.end()) {p = i - 1; break;}
		}
		if (p != -1) {
			for (int i = v; i <= p; i++) st.erase(st.find(i)), q2.emplace_back(i);
		} else {
			for (int i = v; i <= v + x - 1; i++) st.erase(st.find(i));
			q1.emplace(v + x - 1);
		}
	}
	sort(q2.begin(), q2.end());
	for (int i : q2) {
		auto it = q1.find(i - 1);
		if (it == q1.end()) return false;
		q1.erase(it), q1.emplace(i);
	} 
	return true;
}

void _main() {
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];
	int l = 1, r = n, res = -1;
	while (l <= r) {
		int mid = (l + r) >> 1;
		if (check(mid)) l = mid + 1, res = mid;
		else r = mid - 1;
	} cout << res;
}
思路为先把组的人数调到 mid,剩下的最后再调整,WA 60pts。
不能理解为什么是错的,求可以手玩的 hack。

回复

2 条回复,欢迎继续交流。

正在加载回复...