专栏文章

CF2167E khba Loves to Sleep! 题解

CF2167E题解参与者 1已保存评论 0

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@mimz3d5t
此快照首次捕获于
2025/12/01 17:54
3 个月前
此快照最后确认于
2025/12/01 17:54
3 个月前
查看原文
要求最小值最大,可以想到用二分,二分答案,贪心的放传送门。除了每个人左右答案个长度不能放除外其他全部贪心放满,看看够不够 kk 个,最后按照这个方法再做一遍统计答案即可。注意要特判长度为 00 的情况。
代码:
CPP
#include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 5;

int T, n, k, x, a[N], ans[N], cnt;

bool check(int mid)
{
	int p = 0;
	p += max(a[1] - mid + 1, 0) + max(x - a[n] - mid + 1, 0);
	for (int i = 1; i < n; i ++ ) p += max(a[i + 1] - a[i] + 1 - mid * 2, 0);
	return p >= k;
}

void solve()
{
	cnt = 0;
	scanf("%d%d%d", &n, &k, &x);
	for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
	sort(a + 1, a + n + 1);
	int l = 0, r = x;
	while (l < r)
	{
		int mid = (l + r + 1) >> 1;
		if (check(mid)) l = mid;
		else r = mid - 1;
	}
	if (l == 0)
	{
		for (int i = 0; i < k; i ++ ) printf("%d ", i);
		puts("");
		return;
	}
	vector<int> res;
	for (int p = 0; p <= a[1] - l && (int)res.size() < k; p ++ ) res.push_back(p);
	for (int i = 1; i < n && (int)res.size() < k; i ++ )
	{
		int st = a[i] + l, en = a[i + 1] - l;
		for (int p = st; p <= en && (int)res.size() < k; p ++ ) res.push_back(p);
	}
	for (int p = a[n] + l; p <= x && (int)res.size() < k; p ++ ) res.push_back(p);
	int cur = 0;
	while ((int)res.size() < k)
	{
		bool flag = false;
		for (int v : res)
			if (v == cur)
			{
				flag = true;
				break;
			}
		if (!flag) res.push_back(cur);
		cur ++ ;
	}
	for (int i = 0; i < k; i ++ ) printf("%d ", res[i]);
	puts("");
}

int main()
{
	cin >> T;
	while (T -- ) solve();
	return 0;
}


评论

0 条评论,欢迎与作者交流。

正在加载评论...