题解:CF2139B Cake Collection

· · 题解

发现其他文章的代码相对复杂一些,这里来交一篇代码相对容易的题解。

题目传送门

https://www.luogu.com.cn/problem/CF2139B

思路

(观看须知:非特别说明,本题解中的第 i 个烤箱均指对蛋糕的产量升序排序后的第 i 个烤箱)

可以发现,对于每个烤箱,在第 i 秒进行最后一次收集,不论之前收集了多少次,前面的所有收益加上这次的收益是等于在第 i 秒直接收集所有的蛋糕。所以考虑一种思路:在第 m-n 秒开始,先收集第 1 个烤箱,然后依次收集第 2,3\dots n 个烤箱。这种方法一定是最优的。

当然可以发现,当烤箱个数大于可以收集的时间秒数时,这种方式需要一点点的改变。从第 1 秒开始,直接收集第 n-m 个烤箱,按照上面的方式一直收集到第 n 个烤箱。

按照以上分析进行模拟即可。

代码实现

在对于 ans 的计算中,我使用了一个双元的循环,即用了两个变量参与循环。可以发现,在使用了双元之后,代码会变得更容易阅读了。

在代码中,i 代表烤箱降序排序后的号码,j 表示在第 j 秒收集第 i 个烤箱里的蛋糕。

代码

#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;
}