带权路径长度

题目描述

给定n个权值作为n个叶子结点,构造哈夫曼树, 求其带权路径长度。

输入

输入由多组数据组成。
每组数据分成两行。第一行仅一个整数n(2<=n<=100000)。第二行有n个空格分开的权值,值范围在[1,1000000000]之间。

输出

对于每组测试数据,输出一行,即其对应哈夫曼树的带权路径长度对1000000007取模。

样例输入

4
7 5 2 4
8
5 29 7 8 14 23 3 11

样例输出

35
271

提示

注意运算溢出

解决方案

点击查看代码
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
 
int main()
{
    ll n;
    ll a[100001];
    while(cin>>n)
    {
        priority_queue<ll, vector<ll>, greater<ll> > p;
        if(!p.empty())
            p.pop();
        for (ll i=0; i<n; i++)
        {
            cin>>a[i];
            p.push(a[i]);
        }
        long long res = 0;
        for(ll i=0;i<n-1;i++)
        {
            ll a = p.top(); p.pop();
            ll b = p.top(); p.pop();
            p.push(a+b);
            res += a+b;
        }
        cout << res%1000000007<< endl;
    }
    return 0;
}

本文作者:蚂蚁追风筝

本文链接:https://www.cnblogs.com/ouhouyi/p/16406757.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @ 2022-06-23 21:08  蚂蚁追风筝  阅读(596)  评论(0编辑  收藏  举报