[UOJ 130]【NOI2015】荷马史诗:哈夫曼树

2024-01-10 18:58

本文主要是介绍[UOJ 130]【NOI2015】荷马史诗:哈夫曼树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击这里查看原题

二叉哈夫曼树教程:http://blog.csdn.net/shuangde800/article/details/7341289
这里是k叉哈夫曼树,依然采取贪心策略,不过需要注意的是首先要判断(n-1)%(k-1)是否为0,不为0则要添加权值为0的节点直到(n-1)%(k-1)=0
这是因为,每次合并操作会取出k个点,放进1个点,即每次减少k-1个点。而最终目标是使n个点变为1个点,因此需要用(n-1)%(k-1)来判断

/*
User:Small
Language:C++
Problem No.:130
*/
#include<bits/stdc++.h>
#define ll long long
#define inf ((ll)1<<60)
#define pli pair<ll,int>
#define mp make_pair
using namespace std;
int n,k,nn;
ll ans; 
priority_queue<pli,vector<pli>,greater<pli> > q;
int main(){freopen("data.in","r",stdin);//ios::sync_with_stdio(false);cin>>n>>k;nn=n;for(int i=1;i<=n;i++){ll x;cin>>x;q.push(mp(x,0));}if((n-1)%(k-1)) nn+=(k-1)-(n-1)%(k-1);for(int i=n+1;i<=nn;i++) q.push(mp(0,0));while(nn!=1){ll tot=0;int fl=0;for(int j=1;j<=k;j++){pli now=q.top();q.pop();tot+=now.first;fl=max(fl,now.second+1);}ans+=tot;q.push(mp(tot,fl));nn-=k-1;}pli fir=q.top();cout<<ans<<endl<<fir.second<<endl;return 0;
}

这篇关于[UOJ 130]【NOI2015】荷马史诗:哈夫曼树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/591750

相关文章

大厂面试:小米嵌入式面试题大全及参考答案(130+道 12万长文)

Flink 架构介绍 Flink 是一个分布式流处理和批处理框架,具有高吞吐、低延迟、高可靠等特点。其架构主要由以下几个部分组成: 客户端(Client):负责将作业提交到集群,并与作业管理器进行交互,获取作业的状态信息。客户端可以是命令行工具、IDE 插件或者自定义的应用程序。作业管理器(JobManager):负责接收客户端提交的作业,协调资源分配,调度任务执行,并监控作业的执

数据结构-非线性结构-树形结构:有序树 ->二叉树 ->哈夫曼树 / 霍夫曼树(Huffman Tree)【根据所有叶子节点的权值构造出的 -> 带权值路径长度最短的二叉树,权值较大的结点离根较近】

哈夫曼树概念:给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。 哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 一、相关概念 二叉树:每个节点最多有2个子树的有序树,两个子树分别称为左子树、右子树。有序的意思是:树有左右之分,不能颠倒 叶子节点:一棵树当中没有子结点的结点称为叶子

哈夫曼树例子

五个字符:a,b,c,d,e,它们出现的的频率为8,14,10,4,18构造相应的哈夫曼树,求出每个字符的哈夫曼编码: 哈夫曼树:54/ \22 32/ \ / \c10 12 b14 e18/ \d4 a8哈夫曼编码:a:011 b:10 c:00 d:010 e:11

合并果子之哈夫曼树——优先队列解决哈夫曼

树-堆结构练习——合并果子之哈夫曼树 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit  Status Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆

解决Ubunntu 20.04 登录百度网盘问题:-130_1__ERR_PROXY_CONNECTION_FAILED

0. 背景 登录百度网盘时出现以下问题: 1. 安装过程 百度网盘下载官方网站 1.1 安装 sudo dpkg -i baidunetdisk_4.17.7_amd64.debsudo apt-get -f install 1.2 卸载 sudo apt remove baidunetdiskrm -rf ~/baidunetdisk 2. 解决问题 参考: Ubu

九度OJ-1172-哈夫曼树

由于建立的哈夫曼树不唯一,所以机试多考察哈夫曼树的带权路径长度和,如此题。此问题最终转化为利用堆模拟建树过程,求出非叶节点的权值和(=该哈夫曼树的带权路径长度和)。(无需作出哈夫曼树的具体结构体)   收获如下:   ①关于哈夫曼树:该树非叶节点的权值和=该哈夫曼树的带权路径长度和   ②关于堆排序:堆排序建堆O(n*logn),初始堆完成后,每次重新调整只需O(logn)(树深),故是

最优二叉树(哈夫曼树)知识点

路径:在一棵树中从一个结点往下到孩子或孙子结点之间的通路 结点的路径长度:从根节点到该节点的路径上分支的数目 树的路径长度:树中每个结点的路径长度之和 结点的权:给树中的结点赋予一个某种含义的值,则该值为该节点的权 结点的带权路径长度:结点的路径长度乘以结点的权 树的带权路径长度(WPL):树中所有叶子结点的带权路径长度 (Weight Path Length)   最优二叉树(哈夫

面试题:byte b = 130;有没有问题?

byte b = 130;有没有问题?,(有)。如果我想让赋值正确,可以怎么做(强制类型转换,截取最低一个字节)?结果是多少呢? 源代码: class Test {public static void main(String[] args) {// 因为byte的范围是:-128到127。(-2^7--2^7-1)// 而130不在此范围内,所以报错。// byte b = 130;//

【数据结构与算法】哈夫曼树,哈夫曼编码 详解

哈夫曼树的数据结构。 struct TreeNode {ElemType data;TreeNode *left, *right;};using HuffmanTree = TreeNode *; 结构体包含三个成员: data 是一个 ElemType 类型的变量,用于存储哈夫曼树节点的数据。left 是一个指向 TreeNode 类型的指针,用于指向哈夫曼树节点的左子节点。righ

使用Java实现哈夫曼编码

前言 哈夫曼编码是一种经典的无损数据压缩算法,它通过赋予出现频率较高的字符较短的编码,出现频率较低的字符较长的编码,从而实现压缩效果。这篇博客将详细讲解如何使用Java实现哈夫曼编码,包括哈夫曼编码的原理、具体实现步骤以及完整的代码示例。 哈夫曼编码原理 哈夫曼编码的基本原理可以概括为以下几个步骤: 统计字符频率:遍历输入数据,统计每个字符出现的频率。构建哈夫曼树:根据字符的频率构建一棵哈