[蓝桥杯][基础练习VIP]Huffuman树
题目描述
Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。
给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:
找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。
重复步骤1,直到{pi}中只剩下一个数。
在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。
本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。
例如,对于数列{pi}={5, 3, 8, 2, 9},Huffman树的构造过程如下:
找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5。
找到{5, 8, 9, 5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8, 9, 10},费用为10。
找到{8, 9, 10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10, 17},费用为17。
找到{10, 17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。
现在,数列中只剩下一个数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树相关推荐
- 问题 1462: [蓝桥杯][基础练习VIP]Huffuman树
题目描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: ...
- 蓝桥杯 基础练习VIP FJ的字符串 java
蓝桥杯 基础练习VIP FJ的字符串 java 题目 题目描述 FJ在沙盘上写了这样一些字符串: A1 = "A" A2 = "ABA" A3 = " ...
- [蓝桥杯][基础练习VIP]完美的代价(贪心)
题目描述 回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的.小龙龙认为回文串才是完美的.现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串. 交换的定义是 ...
- [蓝桥杯][基础练习VIP]分解质因数
题目描述 求出区间[a,b]中所有整数的质因数分解. 提示 先筛出所有素数,然后再分解. 数据规模和约定 2< =a< =b< =10000 输入 输入两个整数a,b. 输出 每行输 ...
- [蓝桥杯][基础练习VIP]2n皇后问题(深搜)
输出一个整数,表示总共有多少种放法. 样例输入 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 样例输出 2 思路:数据量不大,就是暴力搜索,先安排一种皇后,然后再安排另一种皇后. ...
- [蓝桥杯][基础练习VIP]报时助手
题目描述 给定当前的时间,请用英文的读法将它读出来. 时间用时h和分m表示,在英文的读法中,读一个时间的方法是: 如果m为0,则将时读出来,然后加上"o'clock",如3:00读 ...
- [蓝桥杯][基础练习VIP]分解质因数-质数筛选+模拟+双指针
题目描述 求出区间[a,b]中所有整数的质因数分解. 提示 先筛出所有素数,然后再分解. 数据规模和约定 输入 输入两个整数a,b. 2< =a< =b< =10000 输出 每行输 ...
- [蓝桥杯][基础练习VIP]完美的代价-贪心
题目描述 回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的.小龙龙认为回文串才是完美的.现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串. 交换的定义是 ...
- [蓝桥杯][基础练习VIP]芯片测试-思维
题目描述 有n块芯片,有好有坏,已知好芯片比坏芯片多. 每个芯片都能用来测试其他芯片.用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏.而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即 ...
最新文章
- Markdown中数学公式练习(2)
- Ubuntu环境下安装Bochs
- ElasticSearch(笔记)
- 动态代码生成 静态代码生成_将速度提升到自己的个人代码生成器中
- python pip安装第三方库老是报错_#python pip 安装dlib一直失败?#python安装dlib错误...
- Facebook对memcached的提升
- 刷题记录 kuangbin带你飞专题五:并查集
- Go语言编程(旧读书笔记)
- WinHex编写16进制文件通过NetAssist网络调试助手发送文件给服务器
- Abaqus简单部件受力分析
- Oracle数据库SQL技术——习题1
- 视觉 注意力机制——通道注意力、空间注意力、自注意力
- 电桥测量电路Multisim仿真AD电路原理图PCB
- AndroidManifast警告On SDK version 23 and up, your app data will be automatically backed up...
- Macbook Pro的Type-c接口失灵了如何解决?
- Python爬虫实战:分析《战狼2》豆瓣影评
- 【愚公系列】2022年12月 使用win11系统自带SSH,远程控制VMware中Windows虚拟机系统
- 笔记4.3.1缩放规范化--最小值最大值缩放和最大绝对值缩放
- uni-app实现PDA的离线语音(二)MT-TTS离线语音合成插件下载及集成
- MTD系统架构和yaffs2使用、Nandflash驱动设计