NOI 2015 荷马史诗

题意:
扩展的Huffman编码(由以前的二进制变为了k进制)
求编码后文章最短长度和Huffman树的最小高度(或者说最长串最短长度,当然是在文章最短前提下)
你不知道Huffman编码?
你知道Huffman编码但不知道是怎么回事?
看CLRS(算法导论)贪心那一章吧,无比详细,伪代码,图解,证明样样俱全;
你没有CLRS?
白书(算法竞赛入门经典)上也有(但不如CLRS的详细);
连白书都没有?
百(baí)度(chī)百(bì)科(kēng);

题解:
既然已经知道是Huffman编码了那么思路就比较明确了:
仿照Huffman二叉形式写k叉;
二叉形式一次弹出两个(最小值),那k叉一次弹出k个(最小值);
那么就用堆(不是k叉堆);
你用splay?好像也可以;
堆中保存Huffman树中串出现频率和,以及Huffman树的深度;
比较时先比较频率和,再比较深度(不可不比,要保证Huffman树高最小);
每次合并时,ans都要加上合并后长度(要不然求的是串频率和),而深度在取最大后再插入时要加一;
当堆中只有一个元素时退出,这时,ans和该元素深度即为答案;
初始化堆时,各元素深度为0,若n!≡1mod(k-1),那么补齐n,增加的新元素频率为0(显然),深度为0;
重要提示:
想省空间的一定要注意什么时候是long long int,什么时候是 int,尤其注意中间变量!
其实不必担心k太大,用时大概是O(knlogn/(k-1));
注: http://blog.csdn.net/Quack_quack/article/details/46958413,你也可以直接看他写的题解;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值