4198: [Noi2015]荷马史诗

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 1512  Solved: 797
[Submit][Status][Discuss]

Description

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

Allison 最近迷上了文学。她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的《荷马史诗》。但是由《奥德赛》和《伊利亚特》组成的鸿篇巨制《荷马史诗》实在是太长了,Allison 想通过一种编码方式使得它变得短一些。
一部《荷马史诗》中有 n 种不同的单词,从 1 到 n 进行编号。其中第 i 种单词出现的总次数为 wi。Allison 想要用 k 进制串 si 来替换第 i 种单词,使得其满足如下要求:
对于任意的 1≤i,j≤n,i≠j,都有:si 不是 sj 的前缀。
现在 Allison 想要知道,如何选择 si,才能使替换以后得到的新的《荷马史诗》长度最小。在确保总长度最小的情况下,Allison 还想知道最长的 si 的最短长度是多少?
一个字符串被称为 k 进制字符串,当且仅当它的每个字符是 0 到 k−1 之间(包括 0 和 k−1)的整数。
字符串 Str1 被称为字符串 Str2 的前缀,当且仅当:存在 1≤t≤m,使得 Str1=Str2[1..t]。其中,m 是字符串 Str2 的长度,Str2[1..t] 表示 Str2 的前 t 个字符组成的字符串。

Input

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

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

Output

输出文件包括 2 行。

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

Sample Input

4 2
1
1
2
2

Sample Output

12
2

HINT

用 X(k) 表示 X 是以 k 进制表示的字符串。
一种最优方案:令 00(2) 替换第 1 种单词,01(2) 替换第 2 种单词,10(2) 替换第 3 种单词,11(2) 替换第 4 种单词。在这种方案下,编码以后的最短长度为:
1×2+1×2+2×2+2×2=12
最长字符串 si 的长度为 2。
一种非最优方案:令 000(2) 替换第 1 种单词,001(2) 替换第 2 种单词,01(2) 替换第 3 种单词,1(2) 替换第 4 种单词。在这种方案下,编码以后的最短长度为:
1×3+1×3+2×2+2×1=12
最长字符串 si 的长度为 3。与最优方案相比,文章的长度相同,但是最长字符串的长度更长一些。
对于所有数据,保证 2≤n≤100000,2≤k≤9。
选手请注意使用 64 位整数进行输入输出、存储和计算。

Source

[Submit][Status][Discuss] 

HOME Back

  学习了一发哈夫曼树... 于是就来看这道当时让很多神犇跪倒的题目... 怎么会考到这么偏的东西? 不会就跪啊.  看了之后再来看这道题? ??? k进制所以是k叉哈夫曼? 长度最小同时最长也要最小只要在建树过程中贪心一下就行了. 权值相同要深度最小的. 注意不满k叉要补0点.

  为什么priority_queue的排序重载方式要反过来? 调了半天. (主要是我弱)

#include<bits/stdc++.h>
using namespace std;
typedef long long lnt;
lnt ans;
int n, res, k;
struct node {lnt val; int dep;inline friend bool operator < (const node &a ,const node &b) {return (a.val == b.val) ? a.dep > b.dep : a.val > b.val;}
};
priority_queue<node> q;
inline const lnt read() {register lnt x = 0;register char ch = getchar();while (ch < '0' || ch > '9') ch = getchar();while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();return x;
}
int main() {n = read(), k = read();register lnt x;register int i, res;for (i = 1; i <= n; ++ i)x = read(), q.push((node){x, 1}); res = (n - 1) % (k - 1);if (res) res = k - 1 - res, n += res;for (i = 1; i <= res; ++ i) q.push((node){0, 1});while (n > 1) {int mxd = 0;lnt mxv = 0;for (i = 1; i <= k; ++ i) {mxv += q.top().val;mxd = max(mxd, q.top().dep);q.pop();}n -= k - 1;ans += mxv;q.push((node){mxv, mxd + 1});}printf("%lld\n%d", ans, q.top().dep - 1);
}

[BZOJ]4198 [NOI2015] 荷马史诗 哈夫曼树相关推荐

  1. 【Huffman树】【贪心】【NOI 2015】【bzoj 4198】荷马史诗

    4198: [Noi2015]荷马史诗 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 127 Solved: 80 Description 追逐影子的 ...

  2. bzoj 4198 [ Noi 2015 ] 荷马史诗 —— 哈夫曼编码(k叉哈夫曼树)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4198 第一次写哈夫曼树!看了很多博客. 哈夫曼树 & 哈夫曼编码:https://w ...

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

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

  4. [NOI2015]荷马史诗【哈夫曼编码】

    [NOI2015]荷马史诗 推荐一篇题解 (感觉自己讲不清楚所以不如直接粘题解) 观察之后发现这就是哈夫曼编码,于是按照编码方式构造即可. #include <bits/stdc++.h> ...

  5. (HYSBZ - 4198)荷马史诗

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

  6. NOI2015 荷马史诗

    题目链接:戳我 首先看出来这是一个哈夫曼树! 然后就按照这里面哈夫曼树那一点说的,就可以A掉这个题啦 #include<iostream> #include<cstdio> # ...

  7. P2168 [NOI2015] 荷马史诗(哈夫曼编码树)

    传送门 文章目录 题目描述 解析 细节 代码 题目描述 解析 其实就是构造一棵树 另所有带权点都为叶子节点 其代价为权值与深度的乘积 求最小代价及最小代价下的最小深度 可以看成一开始有n棵小树 每次把 ...

  8. K叉哈夫曼树构造方法 O(N)

    带权路径:是树中所有的叶结点的权值乘上其到根结点的路径长度. 哈夫曼树就是带权路径最小的树. 有n个数(即n个叶子节点),构造k叉(k>=2)哈夫曼树的方法: 构造哈夫曼树,其实就是不停的&qu ...

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

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

  10. 洛谷P2168 荷马史诗 [NOI2015]

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

最新文章

  1. 华裔教授教你写论文2.引言的逻辑解析
  2. 计算机小知识应用,计算机应用知识(要熟悉电脑的运用,这十个小知识你不能不懂!)...
  3. 使用Logstash同步MySQL数据库信息到ElasticSearch
  4. postgresql9.4.4中文手册笔记-9.10 支持枚举函数
  5. 弱事件 WeakEvent
  6. 使用Java 8 Streams进行编程对算法性能的影响
  7. 【大学物理】磁场的高斯定理
  8. Bootstrap学习笔记--常用标签和类模板
  9. intllij idea 快捷键 Mac
  10. div+css 定位浅析
  11. 算法与数据结构面试题(6)-腾讯面试题
  12. jeesite中日期插件
  13. Docker搭建内部知识库(Wiki)
  14. c语言extern int的作用,c语言之extern
  15. 使用 HttpWatch 分析 HTTP 协议
  16. 手把手教你搭建SpringCloud项目(十)集成OpenFeign服务接口调用
  17. crash工具分析sysdump使用
  18. 十分钟了解完多目标优化算法
  19. AVI音视频封装格式学习(五)——h265与PCM合成AVI文件
  20. There is no getter for property named ‘username‘ in ‘class com.kuang.entity.User‘“

热门文章

  1. coj #10066新的开始(最小生成树)
  2. html 给文字加图片背景,如何给文字添加背景图?给文字填充图片背景色的操作方法...
  3. 计算机网络跳槽自荐信,计算机网络应用专业求职自荐信范文
  4. M1增速还能指出A股底部吗?
  5. LTspice基础教程-033.绘制电容阻抗特性曲线
  6. android obtain,Android Message.obtain() 之 高效原因分析
  7. Java各种规则引擎
  8. 花花公子推荐伤感qq日志:乖不哭,我拜你
  9. c语言工业设计中的案例,工业设计中CMF为什么这么重要?看看设计案例就知道了!...
  10. ubuntu16.04 独立显卡驱动安装