原题链接

追逐影子的人,自己就是影子。 ——荷马

达达最近迷上了文学。

她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的《荷马史诗》。

但是由《奥德赛》和《伊利亚特》组成的鸿篇巨制《荷马史诗》实在是太长了,达达想通过一种编码方式使得它变得短一些。

一部《荷马史诗》中有 n 种不同的单词,从 1 到 n 进行编号。其中第 i 种单词出现的总次数为 wi。

达达想要用 k 进制串 si 来替换第 i 种单词,使得其满足如下要求:

对于任意的 1≤i,j≤n,i≠j,都有:si 不是 sj 的前缀。

现在达达想要知道,如何选择 si,才能使替换以后得到的新的《荷马史诗》长度最小。

在确保总长度最小的情况下,达达还想知道最长的 si 的最短长度是多少?

一个字符串被称为 k 进制字符串,当且仅当它的每个字符是 0 到 k−1 之间(包括 0 和 k−1)的整数。

字符串 Str1 被称为字符串 Str2 的前缀,当且仅当:存在 1≤t≤m,使得 Str1=Str2[1..t]。

其中,m 是字符串 Str2 的长度,Str2[1..t] 表示 Str2 的前 t 个字符组成的字符串。

注意:请使用 64 位整数进行输入输出、储存和计算。

输入格式

输入文件的第1 行包含 2 个正整数 n,k,中间用单个空格隔开,表示共有 n 种单词,需要使用 k 进制字符串进行替换。

第 2∼n+1 行:第 i+1 行包含 1 个非负整数 wi,表示第 i 种单词的出现次数。

输出格式

输出文件包括 2 行。

第 1 行输出 1 个整数,为《荷马史诗》经过重新编码以后的最短长度。

第 2 行输出 1 个整数,为保证最短总长度的情况下,最长字符串 si 的最短长度。

数据范围

2≤n≤100000,
2≤k≤9
1≤wi≤10^12

输入样例:

4 2
1
1
2
2

输出样例:

12
2

思路:k叉huffman树+堆

题目输入的是n,k,以及n个单词出现的次数,要将单词进行k进制数转换,
使得转换后没有一个单词是另一个单词的前缀,总单词编码树长度最短以及最长的单词长度最小

算法:我们可以根据每个单词的出现次数做成一个k叉huffman树,使得单词出现次数最少的在下面,

同时如果将k叉huffman树看成一个trie树,单词i的编码就是从根节点到叶节点i的路径各字符相连
因此等价于单词长度越长的次数越少,满足使得总长度最小

要使得最长的单词长度最短,只需要将huffman树节点变成pair类型的,first存值,second存该节点的深度

在合并的时候对于权值相同的节点优先考虑当前深度最小的进行合并;其中k叉huffman树的构造不

能直接依次选择堆中最小的k个权值,因为如果最后一轮循环堆的大小在2-(k-1)之间,

huffman树的根的子节点个数<k,这不是最优解:任意将一个深度最大的子节点变为树根子节点都会使得总权值*高度变小

所以可以添加一些额外的0节点,使得叶子节点个数n满足(n-1)%(k-1)=0

#include<iostream>
#include<queue>
#include<vector>
using namespace std;using ll=long long;
using pll=pair<ll,ll>;//first存值,second存该节点的深度int main()
{int n,k;cin>>n>>k;priority_queue<pll,vector<pll>,greater<pll>> heap;for(int i=0;i<n;i++){ll x;cin>>x;heap.push({x,0});//初始深度都为1}while((n-1)%(k-1)!=0){//k叉huffman树使得(n-1)%(k-1)=0heap.push({0,0});n++;}ll res=0;//合并总代价while(heap.size()>1){//构造huffman树ll ans=0,depth=0;for(int i=0;i<k;++i){auto t=heap.top();heap.pop();ans+=t.first;//每一次的合并代价depth=max(depth,t.second);//深度=所有节点深度最大}res+=ans;//heap.push({ans,depth+1});//节点合并后使新节点深度+1}cout<<res<<endl<<heap.top().second;return 0;
}

算法进阶指南:0x17:荷马史诗相关推荐

  1. (HYSBZ - 4198)荷马史诗

    (HYSBZ - 4198)荷马史诗 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1376 Solved: 725 Description 追逐影子 ...

  2. HTML5游戏开发进阶指南(亚马逊5星畅销书,教你用HTML5和JavaScript构建游戏!)

    HTML5游戏开发进阶指南(亚马逊5星畅销书,教你用HTML5和JavaScript构建游戏!) [印]香卡(Shankar,A.R.) 著 谢光磊 译 ISBN 978-7-121-21226-0 ...

  3. [NOI 2015]荷马史诗

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

  4. 阿里大佬总结的算法进阶指南,助你进大厂!

    大家好,我是林哥! 最近一个来自阿里的大佬总结了一份秋招算法进阶指南<LeetCode-Go>,全文一共有150多页,包含了所有常见的核心算法题目,助力大家在秋招末期拿到满意的Offer. ...

  5. 卧槽!阿里《算法进阶指南》火了,完整版 开放下载!

    最近一个来自阿里的大佬总结了一份秋招算法进阶指南<LeetCode-Go>,全文一共有150多页,包含了所有常见的核心算法题目,助力大家在秋招末期拿到满意的Offer. 以下是这份阿里秋招 ...

  6. 写给前端的算法进阶指南,我是如何两个月零基础刷200题 等推荐

    大家好,我是若川. 话不多说,这一次花了几小时精心为大家挑选了20余篇好文,供大家阅读学习.本文阅读技巧,先粗看标题,感兴趣可以都关注一波,一起共同进步. 前端从进阶到入院 作者ssh就职于字节跳动基 ...

  7. 周末狂欢赛4(1-02E. JM的西伯利亚特快专递,寿司晚宴,荷马史诗)

    文章目录 T1:1-02E. JM的西伯利亚特快专递 题目 题解 code T2:寿司晚宴 题目 题解 code T3:荷马史诗 题目 题解 code T1:1-02E. JM的西伯利亚特快专递 题目 ...

  8. ajax荷马史诗,荷马史诗(8)

    <奥德赛>(Odyssey) 奥德修斯的希腊文原意是"麻烦":他既带给别人麻烦,自己也遭遇麻烦 <埃阿斯和卡珊德拉>(Ajax and Cassandra) ...

  9. jzoj 6012.【NOIP2019模拟1.25A组】荷马史诗 dp

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

最新文章

  1. UVA10003 切木棍 Cutting Sticks(区间DP、细节)
  2. C++二维数组讲解、二维数组的声明和初始化
  3. 小孩都看得懂的推荐系统
  4. Jenkins+Gradle+Git自动打apk包,并上传到ftp
  5. css img重复_20 个 CSS 快速提升技巧
  6. antd 3升级命令_是时候拥有一个你自己的命令行工具了
  7. Shell数组操作(添加、删除元素、清空、遍历)
  8. Wordpress简约昼夜切换主页导航
  9. linux 关闭防火墙 centos7,centos7关闭防火墙和selinux
  10. SpringMVC中注解@RequestBody和@ResponseBody的使用区别
  11. 开源一套基于 React Naitve 的业务驱动型 UI 组件库:react-native-atlas
  12. 摩托罗拉ME525/defy 中兴U880 解决QQ游戏大厅“网络连接错误,请稍候再试”问题...
  13. SQL SELECT语句的基本用法
  14. Linux 安装 RMVB,rm,ape文件 解码器
  15. chrome下载速度慢,手把手教学
  16. 工欲善其事,必先利其器!idea最详细的Debug技巧及方法,让你定位bug如探囊取物!
  17. 高通骁龙665能不能升级鸿蒙系统,高通骁龙665性能好不好 高通骁龙665性能测试...
  18. 游戏开发 unity3d python_游戏研发系列 Unity3D/2D游戏开发从0到1 第2版.pdf
  19. web3创业合伙人招募!!!
  20. 使用Typescript实现依赖注入(DI)

热门文章

  1. 数据结构C++边学边做--二叉树的实现(二叉链表实现遍历操作)
  2. 焱融为国家电网打造存算一体的融合基础架构 助推能源行业新基建
  3. lattice下载器HW-USBN-2B LATTICE使用说明
  4. 【一天一门编程语言】Matlab 语言程序设计极简教程
  5. Python 执行Monkey命令
  6. coocsstudio使用经验,导出资源
  7. 【git】拉取修改别人pr与代理设置
  8. 美国康奈尔大学计算机科学博士,大神offer | 恭喜L同学“全奖”录取康奈尔大学-计算机科学博士!...
  9. OpenRasp Java运行时修改字节码技术
  10. cad快速看图软件免费版(手机在线cad快速看图)