P2168 [NOI2015]荷马史诗

题目描述

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

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

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

对于任意的 \(1\le i, j \le n\) , \(i ≠ j\) ,都有:\(s_i\)不是\(s_j\)的前缀。

现在 Allison 想要知道,如何选择\(s_i\),才能使替换以后得到的新的《荷马史诗》长度最小。在确保总长度最小的情况下,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 个非负整数\(w_i\) ,表示第 \(i\) 种单词的出现次数。

输出格式:

输出包括 2 行。

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

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

说明:


如果把编码集合建成字典树,满足所有的编码不是别的的前缀即为所有的编码都在叶子节点结束

总代价为\(\sum w_i*len_i\),\(len_i\)为长度

其实就是在求\(k\)叉哈弗曼树

我们将节点补全至满足\((k-1)|(n-1)\),保证上面的叶子都填满了

然后从小的值开始放叶子节点


Code:

#include <cstdio>
#include <queue>
#define ll long long
using namespace std;
struct node
{
ll w,d;
bool friend operator <(node n1,node n2)
{
return n1.w==n2.w?n1.d>n2.d:n1.w>n2.w;
}
}t;
priority_queue <node> q;
int n,k;
int main()
{
scanf("%d%d",&n,&k);
t.d=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&t.w);
q.push(t);
}
t.w=0;ll ans=0,mx=0;
while((n-1)%(k-1)!=0) q.push(t),++n;
while(q.size()>1)
{
t.d=t.w=0;
for(int i=1;i<=k;i++)
{
t.w+=q.top().w,t.d=max(q.top().d,t.d);
q.pop();
}
++t.d,ans+=t.w,mx=max(mx,t.d);
q.push(t);
}
printf("%lld\n%lld\n",ans,mx);
return 0;
}

2018.8.31

洛谷 P2168 [NOI2015]荷马史诗 解题报告的更多相关文章

  1. 洛谷P2168 [NOI2015] 荷马史诗 [哈夫曼树]

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

  2. 洛谷$P2168\ [NOI2015]$荷马史诗 贪心

    正解:贪心 解题报告: 传送门$QwQ$ 昂这个就哈夫曼树板子题鸭$QwQ$,只是从二叉变成多叉了$QwQ$ 考虑用类似合并果子的方法?就从两个变成$k$个了嘛,一样的鸭,然后就做完了$QwQ$ 注意 ...

  3. 洛谷P2168 [NOI2015] 荷马史诗 (哈夫曼树)

    学了哈夫曼树这道题还是好想的,基本上和构造哈夫曼树的思路一样,但是题目要求最长si的最小值,所以用两个关键字的堆,第一关键字是把出现次数作为权值,第二关键字表示从该节点开始的最长长度,权值相同时,选择 ...

  4. P2168 [NOI2015]荷马史诗

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

  5. 并不对劲的bzoj4198:loj2132:uoj130:p2168:[NOI2015]荷马史诗

    题目大意 有\(n\)(\(n\leq10^5\))种单词,其中第\(i\)种单词在文章中的出现次数为\(w_i\) 要将每个单词替换成一个字符集为\(k\)(\(k\leq9\))的字符串,使对于任 ...

  6. P2168 [NOI2015]荷马史诗 k叉哈夫曼树

    思路:哈夫曼编码 提交:1次(参考题解) 题解:类似合并果子$QwQ$ 取出前$k$小(注意如果叶子结点不满的话要补全),合并起来再扔回堆里去. #include<cstdio> #inc ...

  7. Luogu P2168 [NOI2015]荷马史诗

    题目 哈夫曼树的每个叶子结点都有一个权值(表示某数据的出现频率),且\(\sum dis_ival_i\)最小. 哈夫曼树中,权值和越大的集合离根节点越近. 而每个数据对应从根节点到该叶子结点的一种编 ...

  8. 洛谷 P2146 [NOI2015]软件包管理器 解题报告

    P2146 [NOI2015]软件包管理器 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软 ...

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

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

随机推荐

  1. JS 控制文本框禁止输入例子

    JS 控制不能输入特殊字符 <input type="text"class="domain"onkeyup="this.value=this.v ...

  2. js获取播放器播放时间和停止播放

    html代码 <video id="myVideo" class="video-active" width="100%" height ...

  3. Python学习:变量

    变量(Variables): 是为了存储程序在运算过程中的一些中间结果,为了方便日后调用储存在计算的内存中 官方介绍: Variables are used to storeinformation t ...

  4. QOS-基本拥塞管理机制(PQ CQ WFQ RTPQ)

    QOS-基本拥塞管理机制(PQ CQ WFQ RTPQ) 2018年7月7日    20:29 拥塞:是指当前供给资源相对于正常转发处理需要资源的不足,从而导致服务质量下降的一种现象 拥塞管理概述: ...

  5. JavaSE基础复习---Class类与反射机制

    ---恢复内容开始--- 目录: 1.java.lang.class类 2.Java中的反射机制 3.运行时与编译时概念 1. java.lang.class类 Java程序在运行时,Java运行时系 ...

  6. 深度分析如何在Hadoop中控制Map的数量(摘抄)

    很多文档中描述,Mapper的数量在默认情况下不可直接控制干预,因为Mapper的数量由输入的大小和个数决定.在默认情况下,最终input占据了多少block,就应该启动多少个Mapper.如果输入的 ...

  7. 【数据库】 SQL 通配符

    [数据库] SQL 通配符 1. % : 替代一个或多个字符 2. _ : 仅替代一个字符 3. [] : 字符列中的任何单一字符 4. [^charlist] 或者 [!charlist]  : 不 ...

  8. 【个人训练】(UVa146)ID Codes

    题意与解析 这题其实特别简单,求给定排列的后继.使用stl(next_permutation)可以方便地解决这个问题.但是,想要自己动手解就是另外一回事了.我的解法是从后往前找到第一个$a_i$比$a ...

  9. 【个人训练】(ZOJ3983)Crusaders Quest

    题意分析 和祖玛类似的那种玩法.不过是限定了九个字符,问最好情况下有几次三连碰. 暴力穷举即可.具体的做法是,先把所有"成块"的字符记录下来,然后一个一个删,再继续这样子递归做下去 ...

  10. m个苹果放在n个盘子中有多少种结果

    题目 m个苹果放在n个盘子中有多少种结果,前置条件: 允许存在空盘 重复的摆放结果忽略不计 根据题意,也就是有3种情况,的确完全重复的摆放方式是没多大意义的 思路 这题可以用枚举的描述方式进行尾递归求 ...