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

在这里插入图片描述
在这里插入图片描述

题意:

给定 数组长度 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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值