前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蓝桥杯 基础练习 Huffuman树

蓝桥杯 基础练习 Huffuman树

作者头像
Meng小羽
发布2019-12-23 17:01:39
3160
发布2019-12-23 17:01:39
举报
文章被收录于专栏:Debug客栈Debug客栈

问题描述

  Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。

  给出一列数{pi}={p_0, _p_1, …, _pn-1},用这列数构造Huffman树的过程如下:

  1. 找到{pi}中最小的两个数,设为papb,将papb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。   2. 重复步骤1,直到{pi}中只剩下一个数。   在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。   本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。

  例如,对于数列{pi}={5, 3, 8, 2, 9},Huffman树的构造过程如下:

  1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5。   2. 找到{5, 8, 9, 5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8, 9, 10},费用为10。   3. 找到{8, 9, 10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10, 17},费用为17。   4. 找到{10, 17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。   5. 现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59。

输入格式

  输入的第一行包含一个正整数nn<=100)。

  接下来是n个正整数,表示p_0, _p_1, …, _pn-1,每个数不超过1000。

输出格式

  输出用这些数构造Huffman树的总费用。

样例输入

5

5 3 8 2 9

样例输出

59

C++算法

代码语言:javascript
复制
#include<iostream>
#include<queue>
using namespace std;
priority_queue<int, vector<int>, greater<int> > pq; //构造从小到大的优先队列 
int main() {
  int n;
  cin >> n;
  while (!pq.empty())
    pq.pop();
  int x, s;
  for (int i = 0; i < n; i++) {
    cin >> x;
    pq.push(x); 
  } 
  int sum = 0;
  while (pq.size() > 1) {
    s = pq.top();
    pq.pop();
    s += pq.top();
    pq.pop();
    sum += s;
    pq.push(s);
  }
  cout << sum << endl;
}

本文链接:https://cloud.tencent.com/developer/article/1558121

本文采用CC BY-NC-SA 3.0 Unported协议进行许可,转载请保留此文章链接

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述
    • 输入格式
      • 输出格式
        • 样例输入
          • 样例输出
            • C++算法
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档