思路
根据题意,不难看出,当 \(b>\dfrac{s}{k}\) 时,一定无解,因为无论怎样分配 \(s\),最终的结果一定不会比 \(\dfrac{s}{k}\) 更大。
然后再来考虑当 \(b\le\dfrac{s}{k}\) 时,什么情况下有解什么情况下无解。
因为 \(b=\sum\limits_{i=1}^n\lfloor\dfrac{a_i}{k}\rfloor\) 我们一开始可以直接把其中一位赋值成 \(s\),其它位置皆为 \(0\)。若这时不满足条件,我们可以考虑从 \(s\) 中减去一部分数分到其它位置。根据贪心的思想,我们每次都让 \(s\) 减去的那一部分数尽可能的大,这样才最有可能满足题目的条件。因为 \(\lfloor\dfrac{k-1}{k}\rfloor=0\),所以直接令减去的部分为 \(k-1\) 即可。
每次减去 \(k-1\) 后,判断当前的 \(s\) 是否满足条件。若满足,直接输出构造方案即可,当运行到每一位上都是 \(k-1\) 时,说明没有任何一种情况满足条件,直接输出 \(-1\) 即可。
代码
#include <bits/stdc++.h>
#define int unsigned long long
using namespace std;
int t, n, k, b, s, ans[100010];
signed main() {
scanf("%lld", &t);
while (t--) {
scanf("%lld%lld%lld%lld", &n, &k, &b, &s);
memset(ans, 0, sizeof(ans));
int top = 1;
while (s / k != b && top <= n) {
s -= (k - 1);
ans[top] = (k - 1);
top++;
}
if (s / k == b && top <= n) {
ans[top] = s;
} else {
puts("-1");
continue;
}
for (int i = 1; i <= n; ++i) {
printf("%lld ", ans[i]);
}
putchar('\n');
}
return 0;
}
标签:Beautiful,满足条件,int,题解,ans,CF1715B,减去,lld%,dfrac
From: https://www.cnblogs.com/Dregen-Yor/p/16612989.html