CF1715B Beautiful Array

题意

定义一个 nn 个元素的序列 aa 的价值为 i=1naik\sum\limits_{i = 1}^{n} \left \lfloor \dfrac{a_{i}}{k} \right \rfloor。现在给定 kk,序列价值 bb,序列每个数的总和 ss,请你还原一种序列,或者输出 1-1 表示不存在。

解法

先说个笑话,赛时这题我一眼看上去不会做去做 C 了,C 过了之后回来切了,结果 ÷0\div \, 0 没有特判 fst 了,从 20002000 名掉到 40004000 名。

先考虑第一个数放 ss,其他放 00。那么价值应该为 sk\lfloor \dfrac{s}{k} \rfloor。分情况讨论:

  1. sk<b\lfloor \dfrac{s}{k} \rfloor < b,无解,因为第一个就放 ss 已经最大化了价值。

  2. sk=b\lfloor \dfrac{s}{k} \rfloor = b,则直接构造第一个 ss,其他 00

  3. sk>b\lfloor \dfrac{s}{k} \rfloor > b,考虑在某些位置填 k1k-1。具体细节看代码。

#pragma GCC optimize("-Ofast") 
#include <bits/stdc++.h>
using namespace std;

#define int long long

const int N = 1e5 + 5, INF = 2e9, MOD = 1e9 + 7;

inline int read()
{
	int op = 1, x = 0;
	char ch = getchar();
	while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
	while (ch == '-')
	{
		op = -op;
		ch = getchar();
	}
	while (ch >= '0' and ch <= '9')
	{
		x = (x << 1) + (x << 3) + (ch ^ 48);
		ch = getchar();
	}
	return x * op;
}

inline void write(int x)
{
	if (x < 0) putchar('-'), x = -x;
	if (x > 9) write(x / 10);
	putchar(x % 10 + '0');
}

int n, k, b,s,t;

signed main()
{
	// freopen("*.in", "r", stdin);
	//freopen("1.txt", "w", stdout);
	t=read();
	while(t--)
	{
		n=read(),k=read(),b=read(),s=read();
		if(k==1) // 赛时没加特判,fst
		{
			if(s/k!=b) printf("-1\n");
			else
			{
				printf("%lld ",s);
				for(int i=2;i<=n;i++) printf("0 ");
				printf("\n");
			}
		}
		else if(s/k<b)
		{
			printf("-1\n");
		}
		else if(s/k==b)
		{
			printf("%lld ",s);
			for(int i=2;i<=n;i++) printf("0 ");
			printf("\n");
		}
		else
		{
			int ret=b*k+s%k;
			int left = s-ret;
			int need=ceil(left*1.0/(k-1));
			if(need<n)
			{
				printf("%lld ", ret);
				int sum=0; 
				for(int i=1;i<need;i++) printf("%lld ", k - 1),sum+=k-1;
				printf("%lld ", left-sum);
				for (int i = need+2;i<=n;i++) printf("0 ");
				printf("\n");
			}
			else if (need==n)
			{
				int lp=left%(k-1);
				if(lp==0) lp=k-1;
				if(s%k+lp<k)
				{
					ret=b*k+s%k+lp;
					printf("%lld ", ret);
					for(int i=1;i<need;i++) printf("%lld ", k - 1);
					printf("\n");
				} // 3
				else printf("-1\n");
			}
			else printf("-1\n");
		}
	}
	return 0;
}
posted @   HappyBobb  阅读(2)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示