NC14291 Cut [贪心]+[堆]

Cut

https://ac.nowcoder.com/acm/problem/14291

题意

一个长度为n的序列,一次可将一个序列分割成两个连续的的子序列,分割的代价为原序列的总和,求分成n个子序列需要的最大代价。

题解

反过来思考,令其从n个长度为1的序列合成为一个长度为n的序列。每次合成代价为两序列之和。这时这道题就跟合并果子题十分相似了(合并果子),只需将小根堆换成大根堆即可得到最大代价。
注意数据范围,需要开long long

Code

#include <bits/stdc++.h>
using namespace std;

priority_queue<long long> pq;   //大根堆

int main()
{
    int n;
    scanf("%d",&n);
    for(int i = 0;i < n;++i){
        long long tmp;
        scanf("%lld",&tmp);
        pq.push(tmp);
    }
    long long res = 0;
    while(pq.size() > 1){   //所剩序列在2个及以上
        long long a = pq.top();pq.pop();
        long long b = pq.top();pq.pop();
        res += a+b;         //合并
        pq.push(a+b);
    }
    printf("%lld\n",res);



    return 0;
}
全部评论

相关推荐

程序员花海_:实习和校招简历正确格式应该是教育背景+实习+项目经历+个人评价 其中项目经历注意要体现业务 实习经历里面的业务更是要自圆其说 简历模板尽可能保持干净整洁 不要太花哨的
点赞 评论 收藏
分享
想进开水团喝开水:哦 给我一个 就算你真拿到牛友也会为你开心的
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务