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

Allison最近迷上了文学。她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的《荷马史诗》。但是由《奥德赛》和《伊利亚特》组成的鸿篇巨制《荷马史诗》实在是太长了,Allison想通过一种编码方式使得它变得短一些。

一部《荷马史诗》中有 n 种不同的单词,从 1 到 n 进行编号。其中第 i 种单词出现的总次数为 w[i] 。Allison想要用 k 进制串 s[i] 来替换第 i 种单词,使得其满足如下要求:

对于任意的 1<=i,j<=n , i<>j ,都有: s[i] 不是 s[j] 的前缀。

现在Allison想要知道,如何选择 s[i] ,才能使替换以后得到的新的《荷马史诗》长度最小。在确保总长度最小的情况下,Allison还想知道最长的 s[i] 的最短长度是多少?

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

字符串 Str1 被称为字符串 Str2 的前缀,当且仅当:存在 1<=t<=m ,使得 Str1 = Str2[1..t] 。其中, m 是字符串 str2 的长度, str2[1..t] 表示 str2 的前 t 个字符组成的字符串。

输入描述 Input Description

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

接下来 n 行,第 i+1 行包含 1 个非负整数 w[i] ,表示第 i 种单词的出现次数。

输出描述 Output Description

输出文件包括 2 行。  第 1 行输出 1 个整数,为《荷马史诗》经过重新编码以后的最短长度。 第 2 行输出 1 个整数,为保证最短总长度的情况下,最长字符串 s[i] 的最短长度。

题目简述

k-进制哈夫曼编码

题解

容易得到每次都是选取最小的k个合并,如果大小相同,要选取编码长度短的

开始要先把一些合并起来,才能使答案最优,原因就不赘述了

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<iostream>
  4. #include<string>
  5. #include<string.h>
  6. #include<algorithm>
  7. #include<math.h>
  8. #include<queue>
  9. #include<map>
  10. #include<vector>
  11. #include<set>
  12. #define il inline
  13. #define re register
  14. #define min(a,b) ((a)<(b)?(a):(b))
  15. #define max(a,b) ((a)>(b)?(a):(b))
  16. using namespace std;
  17. const int N=;
  18. typedef long long ll;
  19. int n,k,hs;
  20. struct data{int w;ll v;} h[N];
  21. il ll read(){
  22. re ll hs=;re char c=getchar();
  23. while(!isdigit(c)) c=getchar();
  24. while(isdigit(c)){
  25. hs=(hs<<)+(hs<<)+c-'';
  26. c=getchar();
  27. }
  28. return hs;
  29. }
  30. il bool cmp(re data a,re data b){
  31. return (a.v==b.v)?(a.w<b.w):(a.v<b.v);
  32. }
  33. il void swim(re int p){
  34. re int q=p>>;re data a=h[p];
  35. while(q>&&cmp(a,h[q])){
  36. h[p]=h[q];p=q;q=p>>;
  37. }
  38. h[p]=a;
  39. }
  40. il void sink(re int p){
  41. re int q=p<<;re data a=h[p];
  42. while(q<=hs){
  43. if(q<hs&&cmp(h[q+],h[q])) q++;
  44. if(cmp(a,h[q])) break;
  45. h[p]=h[q];p=q;q=p<<;
  46. }
  47. h[p]=a;
  48. }
  49. il void insert(re data v){
  50. h[++hs]=v;swim(hs);
  51. }
  52. il void pop(){
  53. h[]=h[hs--];sink();
  54. }
  55. int main(){
  56. n=read();k=read();
  57. for(int i=;i<=n;i++){
  58. h[i].v=read();
  59. h[i].w=;
  60. }
  61. sort(h+,h+n+,cmp);hs=n;
  62. re ll ans=,cnt=;
  63. re int maxn;
  64. if((n-)%(k-)>){
  65. for(int i=;i<=(n-)%(k-)+;i++){
  66. cnt+=h[].v;
  67. // print();
  68. pop();
  69. }
  70. insert((data){,cnt});
  71. ans=cnt;
  72. }
  73. while(hs>){
  74. cnt=;maxn=;
  75. for(int i=;i<=k;i++){
  76. cnt+=h[].v;
  77. maxn=max(maxn,h[].w);
  78. pop();
  79. // print();
  80. }
  81. insert((data){maxn+,cnt});
  82. // print();
  83. ans+=cnt;
  84. }
  85. cout<<ans<<endl<<h[].w-<<endl;
  86. return ;
  87. }

【NOI】荷马史诗的更多相关文章

  1. NOI 2015 荷马史诗【BZOJ 4198】k叉Huffman树

    抱歉因为NOIP集训,好长时间没再写题解了. NOI 2015也就只有这道题一看就能懂了-- 4198: [Noi2015]荷马史诗 Time Limit: 10 Sec  Memory Limit: ...

  2. [NOI 2015]荷马史诗

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

  3. [BZOJ4198][Noi2015]荷马史诗

    4198: [Noi2015]荷马史诗 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 700  Solved: 365[Submit][Status] ...

  4. 【NOI2015】荷马史诗

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

  5. bzoj4198 荷马史诗 哈夫曼编码

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

  6. bzoj 4198: [Noi2015]荷马史诗

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

  7. [BZOJ4198] [Noi2015] 荷马史诗 (贪心)

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

  8. [Noi2015]荷马史诗

    来自FallDream的博客,未经允许,请勿转载,谢谢. 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的 ...

  9. BZOJ_4198_[Noi2015]荷马史诗_huffman实现

    BZOJ_4198_[Noi2015]荷马史诗_huffman实现 题意: Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗> ...

随机推荐

  1. GearCase UI - 自己构建一套基于 Vue 的简易开源组件库

    最近 1 ~ 2 月除了开发小程序之外,还一直在继续深入的学习 Vuejs.利用零碎.闲暇的时间整合了一套基于 Vue 的 UI 组件库.命名为 GearCase UI,意为齿轮盒.现在把该项目进行开 ...

  2. 如何解决zabbix snmp异常超时、不稳定、时通时断:Timeout

    针对平时工作中,zabbix snmp出现异常超时.不稳定.时通时断:Timeout while connecting 等的情况,以下我将以使用乐维监控为例,进行解决方案的详细叙述.   一.问题:设 ...

  3. 使用json.dumps转换django queryset的datatime报错问题解决

    转换成json时使用的方法如下: json.dumps(list(models.userlist.objects.values("vu"))) 报错信息如下: Traceback ...

  4. VMware启动Centos时出现错误Cannot open the disk 'xxxxxxx.vmdk' or one of the snapshot disks it depends on. .

    今天拔装虚拟机的硬盘的时候,没有关掉虚拟机,导致虚拟打开的时候出现:Cannot open the disk 'xxxxxxx.vmdk' or one of the snapshot disks i ...

  5. PHP 伪协议

    1.file:// file://用于访问本地文件系统,不受allow_url_fopen影响 <?php include($_GET['file']); ?> 2.http:// GET ...

  6. lscpu命令详解

    基础命令学习目录首页 一.lscpu输出 使用lscpu查看的结果如下图,这里会显示很多信息,如下: 使用lscpu -p会详细的numa信息,如下: [root@localhost ~]# lscp ...

  7. ftp部署及使用

    常用软件安装及使用目录 http://www.jb51.net/article/106604.htm   ftp部署 本篇文章主要介绍了CentOS7.0下安装FTP服务的方法,小编觉得挺不错的,现在 ...

  8. sublime编写markdownm

    sublime编写markdownm 以前用有道云笔记,找了半天更改字体大小,结果还找不 到,那个字实在是太小了,像我这种有强迫症的患者,实 在受不了简约风格的有道云,所以上网找了与和诺插件并 受到一 ...

  9. ahk打印成pdf记录

    软工课程后记: 要求将博客打印成pdf存档.为了偷懒,不想自己点鼠标一个个保存,所以写了一个ahk小程序.博客教程推荐,建议一试,不难.还很方便.我也只学了点点皮毛,满足需求即止. 第一个成功的小例子 ...

  10. Scrum Meeting 6 -2014.11.12

    今天apec最后一天,大部分任务都差不多了,局部测试问题不大.大家修复下小细节就可以开始整合了. Member Today’s task Next task 林豪森 协助测试及服务器部署 协助测试及服 ...