题目描述

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

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 的最短长度。

输入输出样例

输入样例#1:

4 2
1
1
2
2

输出样例#1:

12
2

输入样例#2:

6 3
1
1
3
3
9
9

输出样例#2:

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]相关推荐

  1. 洛谷 P2168 荷马史诗(抄)

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

  2. 洛谷P2168荷马史诗(小根堆)

    首先这个题很容易想到哈夫曼树,但哈夫曼是二进制编码的,而本题为k进制编码,因此也叫作k叉二叉树.既然想到这里,那类似二进制哈夫曼树的构造,我们先构造一个优先队列,(优先队列是个好东西,因为他可以自动排 ...

  3. 洛谷P2168 荷马史诗

    哈夫曼树原理. k=2时,和合并果子一样一样的. 由此思考,k>2时,应该也有相似的原理.确实如此,k进制哈夫曼树,每个结点最多会有k-1个子结点,对应k-1个元素("元素" ...

  4. NOI2015 Day2 T1 荷马史诗(洛谷P2168)

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

  5. 【洛谷P2168】荷马史诗

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

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

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

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

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

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

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

  9. [NOI 2015]荷马史诗

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

最新文章

  1. 管理邮件用户(附图)---Michaelf
  2. HTTP学习三:HTTPS
  3. Win10下使用HDFView查看hdf5文件
  4. 安全测试需要关注那些要点
  5. LeetCode 1602. 找到二叉树中最近的右侧节点(BFS)
  6. 面向视频的全新AI架构 —— 阿里云智能视觉技术全解
  7. nonlocal python3_Python 中的 global、nonlocal 辨析
  8. linux awk浅析(转)
  9. poj 3335 Rotating Scoreboard - 半平面交
  10. android实例教程_Android共享首选项示例教程
  11. WinEdt Latex 插入特殊字符
  12. 本科生毕业论文中期检查表
  13. DiffImg_diffimg下载-diffimg官方版下载[图像对比软件]-天极下载
  14. 渝粤题库 陕西师范大学 《服务礼仪》作业
  15. [usOJ5677]御神渡
  16. 萝卜青菜各有所爱------TypeScript VS JavaScript
  17. 梅科尔工作室-李庆浩 深度学习-KNN算法
  18. windows系统可以用android,如何在电脑上使用Android系统?
  19. Java job interview:网页设计HTML+CSS前端开发与PS前台美化案例分析
  20. python中的pip命令在cmd下用不了?

热门文章

  1. [病毒木马] 利用 Windows 任务计划程序
  2. promise中的all和race方法
  3. PIC16F877A与Proteus仿真-24C01驱动仿真
  4. 2023年iOS App Store上架流程详解(上)
  5. 简单介绍VNPY 1.9.2版本支持看穿式终端的流程
  6. 数控线切割机床可保证加工产品品质的稳定性及一致性
  7. 微软原版WINDOWS10-LTSB-X64位操作系统的全新安装与优化
  8. 开源(离线)中文语音识别ASR(语音转文本)工具整理
  9. AXI协议解析(五)
  10. 入门操作系统知识,这一篇就够啦!