题解 | #搬水果#

搬水果

https://www.nowcoder.com/practice/e4c775b0f3ee42a4bb72c26d2e1eef8a

/// 注意   :  此动态 规划 是 只能合并相邻的两堆
/// 哈夫曼树  是 每次合并可以 从堆中 任意挑选 两堆


// ///状态表示: 集合: 第i堆到第j堆 合并的所有情况   属性: 代价最小
// /// 状态计算 : f[i][j] = min(f[i][k]+f[k][j]) + s[j]-s[i-1]

// //// 为什么动态规划 AC不了啊
// // 我这个 动规 有问题吗
// #include "iostream"
// #include "cstdio"
// #include "algorithm"
// using namespace std;
// const int N = 10010;
// int n;
// int f[N][N];
// int s[N];
// int main() {
//     cin >> n;
//     for (int i = 1; i <= n; i++) {
//         scanf("%d", &s[i]);
//         s[i] += s[i - 1];
//     }
//     for (int len = 2; len <= n; len++) {
//         for (int i = 1; i + len - 1 <= n; i++) {
//             int l = i, r = i + len - 1;
//             f[l][r] = 1e9;
//             for (int k = l; k < r; k++) {
//                 f[l][r] = min(f[l][r], f[l][k] + f[k + 1][r] + s[r] - s[l - 1]);
//             }

//         }

//     }
//     cout << f[1][n] << endl;

// }
#include <functional>
#include<iostream>
#include "algorithm"
#include <cstring>
#include <vector>
#include "queue"
using namespace std;

int n;
int answer;
int main() {
    priority_queue <int , vector<int>,greater<int>> q;
    cin >> n;
    while (n -- ) {
       int x;
       cin >>x;
       q.push(x);
    }
    while(q.size()>1){
        int a=q.top();
        q.pop();
        int b=q.top();
        q.pop();
        answer += a+b;
        q.push(a+b);
    }
    cout << answer <<endl;





    return 0;
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-21 17:16
科大讯飞 算法工程师 28.0k*14.0, 百分之三十是绩效,惯例只发0.9
点赞 评论 收藏
分享
有趣的牛油果开挂了:最近这个阶段收到些杂七杂八的短信是真的烦
点赞 评论 收藏
分享
10-30 10:16
南京大学 Java
龚至诚:给南大✌️跪了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务