1921 Problem C 哈夫曼树

本文介绍了一种使用C++实现的哈夫曼树算法,该算法能够根据输入的叶节点权值生成哈夫曼树,并计算出所有节点值与权值的乘积之和。适用于计算机科学中的数据压缩等领域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题 C: 哈夫曼树
时间限制: 1 Sec 内存限制: 32 MB
献花: 32 解决: 23
[献花][花圈][TK题库]
题目描述
哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。
输入
输入有多组数据。
每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。
输出
输出权值。
样例输入
2
2 8
3
5 11 30
样例输出
10
62

#define _CRT_SECURE_NO_WARNINGS
#include <algorithm>
#include <functional>
#include <iostream>
#include <queue>

using namespace std;
const int MaxN = 30000;

int main()
{
#ifdef _DEBUG
    freopen("data.txt", "r+", stdin);
#endif

    std::ios::sync_with_stdio(false);

    int n, wight;
    priority_queue<int, vector<int>, greater<int> > que;
    while (cin >> n)
    {
        while (que.size())
            que.pop();

        for (int i = 0; i < n; ++i)
        {
            int w;
            cin >> w;
            que.push(w);
        }

        if (que.size() == 1)
        {
            cout << que.top();
            que.pop();
            continue;
        }

        wight = 0;
        while (que.size() > 1)
        {
            int a = que.top();
            que.pop();
            int b = que.top();
            que.pop();

            que.push(a + b);
            wight += (a + b);
        }

        cout << wight << endl;
    }


    return 0;
}

/**************************************************************
    Problem: 1921
    User: Sharwen
    Language: C++
    Result: 升仙
    Time:2 ms
    Memory:1708 kb
****************************************************************/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值