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

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

  1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{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。
    输入
    输入的第一行包含一个正整数n(n< =100)。

接下来是n个正整数,表示p0, p1, …, pn-1,每个数不超过1000。
输出
输出用这些数构造Huffman树的总费用。
样例输入

5
5 3 8 2 9

样例输出

59

解题思路:
简单的huffman树基础题!!!

代码如下:

#include <iostream>
using namespace std;
int s1, s2;
int ans;typedef struct {int w;int p;int l, r;
} *ht, hn;void select(ht &h, int n, int &s1, int &s2) {int minv;for (int i = 1; i <= n; i++)if (h[i].p == 0) {minv = i;break;}for (int i = 1; i <= n; i++) {if (h[i].p == 0)if (h[i].w < h[minv].w)minv = i;}s1 = minv;for (int i = 1; i <= n; i++) {if (h[i].p == 0 && s1 != i) {minv = i;break;}}for (int i = 1; i <= n; i++)if (h[i].p == 0 && s1 != i)if (h[i].w < h[minv].w)minv = i;s2 = minv;}void createtree(ht h, int n) {if (n <= 1)return;int m = 2 * n - 1;h = new hn[m + 1];for (int i = 1; i <= n; i++) {h[i].p = 0;h[i].l = 0;h[i].r = 0;}for (int i = 1; i <= n; i++)cin >> h[i].w;for (int i = n + 1; i <= m; i++) {select(h, i - 1, s1, s2);h[s1].p = i;h[s2].p = i;h[i].l = s1;h[i].r = s2;h[i].w = h[s1].w + h[s2].w;ans += h[i].w;}
}int main() {ht h;int n;cin >> n;createtree(h, n);cout << ans << endl;return 0;
}

[蓝桥杯][基础练习VIP]Huffuman树相关推荐

  1. 问题 1462: [蓝桥杯][基础练习VIP]Huffuman树

    题目描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0,  p1,  -,  pn-1},用这列数构造Huffman树的过程如下: ...

  2. 蓝桥杯 基础练习VIP FJ的字符串 java

    蓝桥杯 基础练习VIP FJ的字符串 java 题目 题目描述 FJ在沙盘上写了这样一些字符串: A1 = "A" A2 = "ABA" A3 = " ...

  3. [蓝桥杯][基础练习VIP]完美的代价(贪心)

    题目描述 回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的.小龙龙认为回文串才是完美的.现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串. 交换的定义是 ...

  4. [蓝桥杯][基础练习VIP]分解质因数

    题目描述 求出区间[a,b]中所有整数的质因数分解. 提示 先筛出所有素数,然后再分解. 数据规模和约定 2< =a< =b< =10000 输入 输入两个整数a,b. 输出 每行输 ...

  5. [蓝桥杯][基础练习VIP]2n皇后问题(深搜)

    输出一个整数,表示总共有多少种放法. 样例输入 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 样例输出 2 思路:数据量不大,就是暴力搜索,先安排一种皇后,然后再安排另一种皇后. ...

  6. [蓝桥杯][基础练习VIP]报时助手

    题目描述 给定当前的时间,请用英文的读法将它读出来. 时间用时h和分m表示,在英文的读法中,读一个时间的方法是: 如果m为0,则将时读出来,然后加上"o'clock",如3:00读 ...

  7. [蓝桥杯][基础练习VIP]分解质因数-质数筛选+模拟+双指针

    题目描述 求出区间[a,b]中所有整数的质因数分解. 提示 先筛出所有素数,然后再分解. 数据规模和约定 输入 输入两个整数a,b. 2< =a< =b< =10000 输出 每行输 ...

  8. [蓝桥杯][基础练习VIP]完美的代价-贪心

    题目描述 回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的.小龙龙认为回文串才是完美的.现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串. 交换的定义是 ...

  9. [蓝桥杯][基础练习VIP]芯片测试-思维

    题目描述 有n块芯片,有好有坏,已知好芯片比坏芯片多. 每个芯片都能用来测试其他芯片.用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏.而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即 ...

最新文章

  1. Markdown中数学公式练习(2)
  2. Ubuntu环境下安装Bochs
  3. ElasticSearch(笔记)
  4. 动态代码生成 静态代码生成_将速度提升到自己的个人代码生成器中
  5. python pip安装第三方库老是报错_#python pip 安装dlib一直失败?#python安装dlib错误...
  6. Facebook对memcached的提升
  7. 刷题记录 kuangbin带你飞专题五:并查集
  8. Go语言编程(旧读书笔记)
  9. WinHex编写16进制文件通过NetAssist网络调试助手发送文件给服务器
  10. Abaqus简单部件受力分析
  11. Oracle数据库SQL技术——习题1
  12. 视觉 注意力机制——通道注意力、空间注意力、自注意力
  13. 电桥测量电路Multisim仿真AD电路原理图PCB
  14. AndroidManifast警告On SDK version 23 and up, your app data will be automatically backed up...
  15. Macbook Pro的Type-c接口失灵了如何解决?
  16. Python爬虫实战:分析《战狼2》豆瓣影评
  17. 【愚公系列】2022年12月 使用win11系统自带SSH,远程控制VMware中Windows虚拟机系统
  18. 笔记4.3.1缩放规范化--最小值最大值缩放和最大绝对值缩放
  19. uni-app实现PDA的离线语音(二)MT-TTS离线语音合成插件下载及集成
  20. MTD系统架构和yaffs2使用、Nandflash驱动设计

热门文章

  1. C语言按行和列求平均成绩代码(指针,二维数组)
  2. linux c之把最简单的字符串数据追加写入文件
  3. Android之使用HandlerThread 以及如何退出总结
  4. linux如何获取网卡计数信息,Linux下如何获取网卡信息
  5. java barrier_Java并发类CyclicBarrier方法详解
  6. 撩妹学会这一招,就没有人能拒绝你!
  7. 程序员必知的 Python 陷阱与缺陷列表
  8. 鉴别一个人是否 js 入门的标准竟然是?!
  9. 《SAS编程与数据挖掘商业案例》学习笔记之五
  10. android技术积累,Android开发中积累的一些报错的解决方法