传送门:149. 荷马史诗 - AcWing题库

哈夫曼树:带权路径长度最短的树,保证权值越大深度尽量越小。

思路:题意转化过来就是求一个k叉哈夫曼树,同时记录最大深度。题目中的编码方式被称为哈夫曼编码。同一层的k个分支上面的字符分别是0~k-1,也能看做是一颗字典树。

题目中的任意一个单词都不会是另一个单词的前缀在字典树里面就是,每一个单词编码的末尾都在叶节点上。

要使深度最小可以额外记录一个变量h,每次取k个元素时若权值相同优先选深度小的。

这里如果单词数量不够会在最后导致没有k个元素可取,所以要补0进去。

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
typedef pair<int,int>PII;
typedef long long ll;
struct node
{ll w,h;bool operator < (node a) const{if(w!=a.w) return w>a.w;else return h>a.h;}
};
priority_queue<node>heap;
int n,k;
int main()
{cin>>n>>k;for(int i=1;i<=n;i++){ll a;cin>>a;heap.push({a,1});}while((n-1)%(k-1)!=0){heap.push({0,1});n++;}ll sum=0;while(heap.size()>1){ll sum1=0,cnt1=0;for(int i=1;i<=k;i++){sum1+=heap.top().w;cnt1=max(cnt1,heap.top().h);heap.pop();}sum+=sum1;heap.push({sum1,cnt1+1});}cout<<sum<<endl;cout<<heap.top().h-1<<endl;return 0;
}

哈夫曼树——荷马史诗(贪心+优先队列)相关推荐

  1. 数据结构与算法--哈夫曼树及其应用

    一.哈夫曼树的基本概念 1) 路径: 从树中一个结点到另一个结点之间的分支构成这两个结点间的路径 2) 结点的路径长度: 两结点间路径上的分支数           3) 树的路径长度:从树根到每一个 ...

  2. 15哈夫曼树/哈夫曼编码

    文章目录 哈夫曼树的基本概念 哈夫曼树的特点 哈夫曼树的构造算法 1. 哈夫曼树的构造过程 代码实现 哈夫曼编码 文件的编码和解码 哈夫曼树的基本概念 哈夫曼树又称为最优树,作用是找到一种效率最高的判 ...

  3. 哈夫曼树 哈夫曼编码

    哈夫曼树 哈夫曼树的定义:设二叉树具有 n 个带权值的叶节点,那么从根节点到各个叶节点的路径长度与相应叶节点权值的乘积的和,叫作二叉树的带权路径长度 WPL (Weighted Path Length ...

  4. Huffman树(哈夫曼树)

    哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数).树的带权路径 ...

  5. 【数据结构-树】哈夫曼树及其应用

    文章目录 1 哈夫曼树的构造 2 哈夫曼树的应用--哈夫曼编码 3 相关例子 4 求哈夫曼树的 WPL 代码 1 哈夫曼树的构造 将 n 个结点作为 n 棵仅含一个节点的二叉树,构成森林 F 在 F ...

  6. 1道动态规划(搬箱子)、KMP算法、图(Prim算法)、1道哈夫曼树

    1.最长递增子序列 华华要给厂里进一批新箱子共n个(n<=500),编号为1到n,用一个正整数ai(1<=ai<=10000)(1<=i<=n)来表示编号为i的箱子的高度 ...

  7. C++ 漫谈哈夫曼树

    1. 前言 什么是哈夫曼树? 把权值不同的n个结点构造成一棵二叉树,如果此树满足以下几个条件: 此 n 个结点为二叉树的叶结点 . 权值较大的结点离根结点较近,权值较小的结点离根结点较远. 该树的带权 ...

  8. [Huffman树] aw149. 荷马史诗(哈夫曼模型+贪心)

    文章目录 1. 题目来源 2. 题目解析 1. 题目来源 链接:149. 荷马史诗 2. 题目解析 k叉哈夫曼树问题. n 个叶子节点合并成 1 个点,总共合并减少 n-1 个点,每次合并都会减少 ( ...

  9. 【BZOJ4198】荷马史诗,贪心之k叉哈夫曼树

    传送门 思路: 很早以前听说过这个题 据说是一个很强的贪心(?) 然后一上来就往贪心上去想--(其实一开始知道算法不是很好,因为你不会走弯路了) 发现这玩意好像是个合并果子的模型-- 也不知道是怎么转 ...

  10. 荷马史诗【k叉哈夫曼树】

    题目描述 追逐影子的人,自己就是影子. --荷马 达达最近迷上了文学. 她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>. 但是由<奥德赛>和 ...

最新文章

  1. java 加密算法 base64
  2. vue从入门到进阶:Vuex状态管理(十)
  3. 用 Flask 来写个轻博客 (20) — 实现注册表单与应用 reCAPTCHA 来实现验证码
  4. Qt opencv 程序异常结束,crashed
  5. 【Cocos2d-x】源代码分析之 2d/ui/Widget
  6. 使用kNN算法实现简单的手写文字识别
  7. java 编写 servlet 程序_Java技术分享:如何编写servlet程序
  8. linux perl占用大量资源_Monitorix:一款面向Linux/Unix系统的网络监测工具
  9. mysql sql查询当天_sql查询当天数据
  10. 王者荣耀美化包制作教程(一;进阶)
  11. 法信智推搜索引擎_法学工具分享
  12. ckplayer只调用html,Ckplayer的安装及调用
  13. html列表自动无限循环滚动,js 无限循环垂直滚动列表
  14. SAP采购定价过程-条件技术介绍
  15. android app 三星s8 适配问题 和 meta-data 动态修改
  16. Greedy Gift Givers
  17. 精品慕课资源推荐 计算机网络
  18. 大连理工大学开发区校区新手指南——2.校园介绍篇
  19. 算法设计 - 二分法和三分法,洛谷P3382
  20. HTML学习(—..—)

热门文章

  1. A股市股票行情实时数据最简封装API接口的python实现
  2. libsvm多分类python_LIBSVM (三) 葡萄酒种类识别
  3. spotbug常见错误心得
  4. MySQL中全局变量、会话变量、用户变量和局部变量的区别
  5. 百度地图地图API(常用)
  6. 服务器系统宕机什么意思,服务器宕机是什么意思?
  7. 魔兽争霸3 the oracle,疯狂SQL之魔兽争霸
  8. 农业银行透支卡和信用卡什么关系?2019年农业银行透支卡透支额度?
  9. 谈谈任务调度的四种实现方式
  10. 服务器的正向代理与反向代理