Aquacolor

Aquacolor



1048div2?????

zcxsb · 2025-09-10 · 11浏览 · 未分类


A题随便过了

B题,每个烤箱都有各自的产能,每秒可以去拿积累的产品

赛时想到,最后一步一定是最大产能的那个,因为这样最大产能的那个积累的最多一定要拿到。

然后有一点dp的想法,所以当n<m的时候,有


	int t, n, m;
	cin >> t;
	while (t--)
	{
		cin >> n >> m;
		for(int i = 1; i <= n; i++) {
			cin >> speed[i];
		}

		for(int j = 1; j <= m; j++) {
			f[1][j] = speed[1] * j;//注:需要优化
		}

		for(int i = 2; i <= n; i++) {
			for (int j = 2; j <= m; j++) {
				f[i][j] = f[i-1][j-1] + j * speed[i];
			}
		}
		cout << f[n][m] << endl;
	}

发现n<m的时候无解,而且此时时间复杂度极高。

后面就没去想了,因为已经24点了

现在认真抄袭他人解法(https://codeforces.com/blog/entry/146178) 之后,获得了一些结论:

当n(烤箱数)> m (秒数) 的时候,一定是从产能前m的烤箱中去拿,而且昨晚推出来了,是从前x个里面轮流拿,按照先小后大的原则。

那么完备了理论之后,就可以总结出来

先把烤箱产能降序排

烤箱ovencount = min (n,m)

i从0遍历到ovencount-1, 对每个i,他是倒数第i个拿出来的,那么积累的量就是(m-i)*a[i]

这时就有一个疑问,当ovencount=n,那么不可能每个烤箱只取一次,那么这个积累量是怎么算的呢?

这就涉及昨天推的子问题,昨天认为是在前i个里面选的。也就是最小的i个里面的子问题,

暂时不知道咋推

ls:m>n的时候,对后n秒的取法就跟之前一样,他们积累的权是n-i 对前面m-n秒,对一个特定物品i,其取一次,其他物品就会积累1次,那么对每个物品i都取一次,其他物品就会积累m-n-1次,而且这个物品在这时取的时候也取了一次,那就是m-n的权





comment 评论区

添加新评论





  • ©2025 bilibili.com

textsms
内容不能为空
account_circle
昵称不能为空
email
邮件地址格式错误
web
beach_access
验证码不能为空
keyboard发表评论


star_outline 咱快来抢个沙发吧!




©2025 Aquacolor

鄂ICP备2024059763号-1

鄂公网安备42011102005556号



Theme Romanticism2.1 by Akashi
Powered by Typecho