Codeforces Round #816 (Div. 2) B - Beautiful Array(构造)

Codeforces Round #816 (Div. 2) B - Beautiful Array(构造)_第1张图片
Codeforces Round #816 (Div. 2) B - Beautiful Array(构造)_第2张图片

题意:

给定 数组长度 n参数 k数组内所有数 / k 的总和 b原始数组的数字总和 s,请 构造 出该数组。

思路:

根据样例的提示,我们发现可以 b 的贡献全部累加在一个位置上,如果有 剩余,要 均摊 在其他位置上。

比如我们 先将 a[n] = (b + 1) * k - 1,这样就可以使得:a[n] / k == b如果 s < k * b,说明 s 过小,那么 一定是 -1

那么接下来就是考虑 剩余部分,因为我们 已经把 b 构造好了,剩下的 对于 b 的贡献应该是 0,对于 每一位 我们 放置 k - 1 即可

那么必然可以 保证 b 满足要求。但是 如果 放完之后还有剩余,那么 说明 s 过大,输出 -1

代码:

#include <bits/stdc++.h>

using namespace std;
//#define map unordered_map
#define int long long
int n, b, k, s;

signed main()
{
	int T; cin >> T;
	while (T--)
	{
		cin >> n >> k >> b >> s;
		vector<int> a(n + 10);
		int t = 0;
		t = s / k;
		if (t < b) {
			puts("-1");
			continue;
		}
		a[n] = max(0ll, min(s, (b + 1) * k - 1));
		t = s - a[n];
		for (int i = n - 1; i >= 1; --i) {
			if (t >= (k - 1)) a[i] = k - 1, t -= (k - 1);
			else {
				a[i] = t;
				t = 0;
				break;
			}
		}
		if (t) {
			puts("-1");
			continue;
		}
		for (int i = 1; i <= n; ++i) {
			printf("%lld ", a[i]);
		}
		puts("");
	}

	return 0;
}

你可能感兴趣的:(构造题,算法,c++)