专栏文章

题解:CF2139B Cake Collection

CF2139B题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@ming6p74
此快照首次捕获于
2025/12/02 01:53
3 个月前
此快照最后确认于
2025/12/02 01:53
3 个月前
查看原文
发现其他文章的代码相对复杂一些,这里来交一篇代码相对容易的题解。

题目传送门

思路

(观看须知:非特别说明,本题解中的第 ii 个烤箱均指对蛋糕的产量升序排序后的第 ii 个烤箱)
可以发现,对于每个烤箱,在第 ii 秒进行最后一次收集,不论之前收集了多少次,前面的所有收益加上这次的收益是等于在第 ii 秒直接收集所有的蛋糕。所以考虑一种思路:在第 mnm-n 秒开始,先收集第 11 个烤箱,然后依次收集第 2,3n2,3\dots n 个烤箱。这种方法一定是最优的。
当然可以发现,当烤箱个数大于可以收集的时间秒数时,这种方式需要一点点的改变。从第 11 秒开始,直接收集第 nmn-m 个烤箱,按照上面的方式一直收集到第 nn 个烤箱。
按照以上分析进行模拟即可。

代码实现

在对于 ansans 的计算中,我使用了一个双元的循环,即用了两个变量参与循环。可以发现,在使用了双元之后,代码会变得更容易阅读了。
在代码中,ii 代表烤箱降序排序后的号码,jj 表示在第 jj 秒收集第 ii 个烤箱里的蛋糕。

代码

CPP
#include<bits/stdc++.h>
using namespace std;
bool cmp(int a,int b)
{
	return a>b;
}
int main()
{
	long long t;
	cin>>t;
	while(t--)
	{
		long long n,m;
		cin>>n>>m;
		long long a[n],ans=0;
		for(long long i=0;i<n;i++)
		{
			cin>>a[i];
		}
		sort(a,a+n,cmp);//对数组 a 进行降序排序 
		for(long long i=0;i<n;i++)
		{
			cout<<a[i]<<" ";
		}
		cout<<endl;
		for(int i=0,j=m;i<min(n,m);i++,j--)//i 代表烤箱的号码,j 表示收集这个烤箱里的蛋糕的时间 
		{
			ans+=j*a[i];
		}
		cout<<ans<<endl;
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...