洛谷P2168 荷马史诗 [NOI2015]
题目描述
追逐影子的人,自己就是影子 ——荷马
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个字符组成的字符串。
输入输出格式
输入格式:
输入的第 1 行包含 2 个正整数 n, k ,中间用单个空格隔开,表示共有 n种单词,需要使用k进制字符串进行替换。
接下来n行,第 i + 1 行包含 1 个非负整数wi ,表示第 i 种单词的出现次数。
输出格式:
输出包括 2 行。
第 1 行输出 1 个整数,为《荷马史诗》经过重新编码以后的最短长度。
第 2 行输出 1 个整数,为保证最短总长度的情况下,最长字符串 si 的最短长度。
输入输出样例
4 2 1 1 2 2
12 2
6 3 1 1 3 3 9 9
36 3
说明
【样例说明 1】
用 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】
一种最优方案:令 000(3) 替换第 1 种单词,001(3) 替换第 2 种单词,01(3) 替换第 3 种单词, 02(3) 替换第 4 种单词, 1(3) 替换第 5 种单词, 2(3) 替换第 6 种单词。
【提示】
选手请注意使用 64 位整数进行输入输出、存储和计算。
【时限1s,内存512M】
哈夫曼树问题
如果k=2,和合并果子一样一样的。
如果k>2,就当成是一次合并k个果子好了233。首先加点空单词进去,使得总单词种类数n%(k-1)==1,方便合并。详细步骤见代码。
1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 #include<cstdio> 6 #include<queue> 7 using namespace std; 8 const int mxn=100010; 9 struct tr{ 10 long long num; 11 long long dep; 12 }; 13 bool operator < (tr a,tr b){ 14 if(a.num!=b.num)return a.num>b.num; 15 return a.dep>b.dep; 16 } 17 long long n,k; 18 long long a[mxn]; 19 long long ans=0; 20 long long mxdep=0; 21 priority_queue<tr>q; 22 int main(){ 23 scanf("%lld%lld",&n,&k); 24 int i,j; 25 for(i=1;i<=n;i++) 26 scanf("%lld",&a[i]); 27 if(k!=2) 28 while(n%(k-1)!=1){ 29 n++; 30 a[n]=0; 31 } 32 for(i=1;i<=n;i++){ 33 // printf("-- %d\n",a[i]); 34 q.push((tr){a[i],0}); 35 } 36 while(q.size()!=1){ 37 tr node=(tr){0,0}; 38 mxdep=0; 39 for(i=1;i<=k;i++){ 40 tr now=q.top();q.pop(); 41 // printf("TE: %d %d\n",now.num,now.dep); 42 node.num+=now.num; 43 mxdep=max(mxdep,now.dep); 44 } 45 ans+=node.num; 46 node.dep=mxdep+1; 47 q.push(node); 48 49 } 50 cout<<ans<<endl<<mxdep+1; 51 return 0; 52 }
转载于:https://www.cnblogs.com/SilverNebula/p/5818791.html
洛谷P2168 荷马史诗 [NOI2015]相关推荐
- 洛谷 P2168 荷马史诗(抄)
题目描述 追逐影子的人,自己就是影子 --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛&g ...
- 洛谷P2168荷马史诗(小根堆)
首先这个题很容易想到哈夫曼树,但哈夫曼是二进制编码的,而本题为k进制编码,因此也叫作k叉二叉树.既然想到这里,那类似二进制哈夫曼树的构造,我们先构造一个优先队列,(优先队列是个好东西,因为他可以自动排 ...
- 洛谷P2168 荷马史诗
哈夫曼树原理. k=2时,和合并果子一样一样的. 由此思考,k>2时,应该也有相似的原理.确实如此,k进制哈夫曼树,每个结点最多会有k-1个子结点,对应k-1个元素("元素" ...
- NOI2015 Day2 T1 荷马史诗(洛谷P2168)
题目描述 追逐影子的人,自己就是影子 --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛&g ...
- 【洛谷P2168】荷马史诗
题目描述 追逐影子的人,自己就是影子 --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛&g ...
- [NOI2015]荷马史诗【哈夫曼编码】
[NOI2015]荷马史诗 推荐一篇题解 (感觉自己讲不清楚所以不如直接粘题解) 观察之后发现这就是哈夫曼编码,于是按照编码方式构造即可. #include <bits/stdc++.h> ...
- ajax荷马史诗,荷马史诗(8)
<奥德赛>(Odyssey) 奥德修斯的希腊文原意是"麻烦":他既带给别人麻烦,自己也遭遇麻烦 <埃阿斯和卡珊德拉>(Ajax and Cassandra) ...
- 【Huffman树】【贪心】【NOI 2015】【bzoj 4198】荷马史诗
4198: [Noi2015]荷马史诗 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 127 Solved: 80 Description 追逐影子的 ...
- [NOI 2015]荷马史诗
Description 追逐影子的人,自己就是影子. --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由& ...
最新文章
- 管理邮件用户(附图)---Michaelf
- HTTP学习三:HTTPS
- Win10下使用HDFView查看hdf5文件
- 安全测试需要关注那些要点
- LeetCode 1602. 找到二叉树中最近的右侧节点(BFS)
- 面向视频的全新AI架构 —— 阿里云智能视觉技术全解
- nonlocal python3_Python 中的 global、nonlocal 辨析
- linux awk浅析(转)
- poj 3335 Rotating Scoreboard - 半平面交
- android实例教程_Android共享首选项示例教程
- WinEdt Latex 插入特殊字符
- 本科生毕业论文中期检查表
- DiffImg_diffimg下载-diffimg官方版下载[图像对比软件]-天极下载
- 渝粤题库 陕西师范大学 《服务礼仪》作业
- [usOJ5677]御神渡
- 萝卜青菜各有所爱------TypeScript VS JavaScript
- 梅科尔工作室-李庆浩 深度学习-KNN算法
- windows系统可以用android,如何在电脑上使用Android系统?
- Java job interview:网页设计HTML+CSS前端开发与PS前台美化案例分析
- python中的pip命令在cmd下用不了?
热门文章
- [病毒木马] 利用 Windows 任务计划程序
- promise中的all和race方法
- PIC16F877A与Proteus仿真-24C01驱动仿真
- 2023年iOS App Store上架流程详解(上)
- 简单介绍VNPY 1.9.2版本支持看穿式终端的流程
- 数控线切割机床可保证加工产品品质的稳定性及一致性
- 微软原版WINDOWS10-LTSB-X64位操作系统的全新安装与优化
- 开源(离线)中文语音识别ASR(语音转文本)工具整理
- AXI协议解析(五)
- 入门操作系统知识,这一篇就够啦!