专栏文章
题解:CF2139B Cake Collection
CF2139B题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @ming6p74
- 此快照首次捕获于
- 2025/12/02 01:53 3 个月前
- 此快照最后确认于
- 2025/12/02 01:53 3 个月前
发现其他文章的代码相对复杂一些,这里来交一篇代码相对容易的题解。
题目传送门
思路
(观看须知:非特别说明,本题解中的第 个烤箱均指对蛋糕的产量升序排序后的第 个烤箱)
可以发现,对于每个烤箱,在第 秒进行最后一次收集,不论之前收集了多少次,前面的所有收益加上这次的收益是等于在第 秒直接收集所有的蛋糕。所以考虑一种思路:在第 秒开始,先收集第 个烤箱,然后依次收集第 个烤箱。这种方法一定是最优的。
当然可以发现,当烤箱个数大于可以收集的时间秒数时,这种方式需要一点点的改变。从第 秒开始,直接收集第 个烤箱,按照上面的方式一直收集到第 个烤箱。
按照以上分析进行模拟即可。
代码实现
在对于 的计算中,我使用了一个双元的循环,即用了两个变量参与循环。可以发现,在使用了双元之后,代码会变得更容易阅读了。
在代码中, 代表烤箱降序排序后的号码, 表示在第 秒收集第 个烤箱里的蛋糕。
代码
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 条评论,欢迎与作者交流。
正在加载评论...