CF1715B Beautiful Array 题解

思路

根据题意,不难看出,当 \(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;
}


posted @ 2022-08-22 15:37  Dregen_Yor  阅读(44)  评论(0)    收藏  举报