题意:
给定 数组长度 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;
}