[tree]合并果子(哈夫曼树+优先队列)

现在有n堆果子,第i堆有ai个果子。现在要把这些果子合并成一堆,每次合并的代价是两堆果子的总果子数。求合并所有果子的最小代价。

Input

第一行包含一个整数T(T<=50),表示数据组数。
每组数据第一行包含一个整数n(2<=n<=1000),表示果子的堆数。
第二行包含n个正整数ai(ai<=100),表示每堆果子的果子数。

Output

每组数据仅一行,表示最小合并代价。

 

#include <iostream>
#include <queue>
#include <vector>
#include <functional>//尼玛greater在这里
using namespace std;
int main()
{
    int t, n, a;
    cin >> t;
    while (t--){
        priority_queue < int, vector<int>, greater<int> > q;
        cin >> n;
        for (int i = 0; i < n; i++){
            cin >> a;
            q.push(a);
        }
        int sum = 0;
        while (!q.empty()){
            int b = q.top();
            q.pop();
            if (q.empty()){
                break;
            }
            else{
                int c = q.top();
                q.pop();
                sum = sum + b + c;//合并
                q.push(b + c);//attention!每次合并的代价
            }
        }
        cout << sum << endl;
    }
    return 0;
}

优先队列格式注意一下0.0

 

posted @ 2018-06-09 16:15  Newdawnfades  阅读(159)  评论(0编辑  收藏  举报