bzoj 4198: [Noi2015]荷马史诗
Description
追逐影子的人,自己就是影子。 ——荷马
Input
输入文件的第 1 行包含 2 个正整数 n,k,中间用单个空格隔开,表示共有 n 种单词,需要使用 k 进制字符串进行替换。
Output
输出文件包括 2 行。
Sample Input
1
1
2
2
Sample Output
2
HINT
Source
到现在才会Huffman树的我,终于把这个坑给填了;
首先百度百科:
给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)
实现方法就是每次取堆中两个权值最小的点合并,然后用一个虚拟点代表这两个点,再放入堆中;
然后叶子节点的编码长度为到根的距离,然后编码就是从根往下走,如果是在左儿子中则为1,在右儿子中则为0;
这个题实际上就是要构建一棵k叉Huffman树,所以编码就是k进制的,编码原则和二叉类似;
因为构建Huffman树的话是不会出现某个编码是另一个编码的前缀的,所以没有问题(这个分类一下就清楚了);
然后我们按照普通Huffman树的构法,每次取k个点进行合并即可;然后还要求了到根的最长路径最短,那么我们在堆中以深度为第二关键字,优先合并深度大的;
注意可能取到后面就没有k个点了,所以我们需要把他补成满k叉树的叶子节点个数;
//MADE BY QT666
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
const int N=1000050;
struct data{ll v,dep;};
bool operator < (data a,data b){
if(a.v==b.v) return a.dep>b.dep;
return a.v>b.v;
}
priority_queue<data> Q;
ll v[N],ans,n,tot,k;
int main(){
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++) scanf("%lld",&v[i]),Q.push((data){v[i],1});
tot=n;
if((n-1)%(k-1)) tot+=(k-1-(n-1)%(k-1));
for(int i=n+1;i<=tot;i++) Q.push((data){0,1});
while(Q.size()>1){
ll tmp=0,res=0;
for(int i=1;i<=k;i++){
ans+=Q.top().v;
tmp+=Q.top().v,res=max(res,Q.top().dep);Q.pop();
}
if(Q.empty()){printf("%lld\n%lld",ans,res);}
Q.push((data){tmp,res+1});
}
return 0;
}
bzoj 4198: [Noi2015]荷马史诗的更多相关文章
- BZOJ 4198: [Noi2015]荷马史诗 哈夫曼树 k叉哈夫曼树
https://www.lydsy.com/JudgeOnline/problem.php?id=4198 https://blog.csdn.net/chn_jz/article/details/7 ...
- bzoj 4198 [Noi2015]荷马史诗——哈夫曼树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4198 学习一下哈夫曼树.https://www.cnblogs.com/Zinn/p/940 ...
- bzoj 4198: [Noi2015]荷马史诗【哈夫曼树+贪心】
和合并果子类似(但是是第一次听说哈夫曼树这种东西) 做法也类似,就是因为不用知道树的形态,所以贪心的把最小的k个点合为一个节点,然后依次向上累加即可,具体做法同合并果子(但是使用优先队列 注意这里可能 ...
- [BZOJ4198][Noi2015]荷马史诗
4198: [Noi2015]荷马史诗 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 700 Solved: 365[Submit][Status] ...
- BZOJ_4198_[Noi2015]荷马史诗_huffman实现
BZOJ_4198_[Noi2015]荷马史诗_huffman实现 题意: Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗> ...
- 洛谷 P2168 [NOI2015]荷马史诗 解题报告
P2168 [NOI2015]荷马史诗 题目描述 追逐影子的人,自己就是影子 --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷 ...
- 【BZOJ4198】[Noi2015]荷马史诗 贪心+堆
[BZOJ4198][Noi2015]荷马史诗 Description 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅 ...
- [UOJ#130][BZOJ4198][Noi2015]荷马史诗
[UOJ#130][BZOJ4198][Noi2015]荷马史诗 试题描述 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静 ...
- BZOJ4198 & 洛谷2168 & UOJ130:[NOI2015]荷马史诗——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4198 https://www.luogu.org/problemnew/show/P2168 ht ...
随机推荐
- python学习笔记 list
1.list中的任一元素可以是任一类型.可以是混合的,如,前两个字符串后面的是数字.都是可以的. 2.可以用-1表示最后一个元素. 3.注意不要越界. 4.len(mates) 用来计算list的大小 ...
- 记一次改造react脚手架的过程
公司突然组织需要重新搭建一个基于node的论坛系统,前端采用react,上网找了一些脚手架,或多或少不能满足自己的需求,最终在基于YeoMan的react脚手架generator-react-webp ...
- [全排列]--A Number Puzzle
标签: ACM Lele 最近上课的时候都很无聊,所以他发明了一个数字游戏来打发时间. 这个游戏是这样的,首先,他拿出几张纸片,分别写上0到9之间的任意数字(可重复写某个数字),然后,他叫同学随便写两 ...
- 【微服务】之五:轻松搞定SpringCloud微服务-调用远程组件Feign
上一篇文章讲到了负载均衡在Spring Cloud体系中的体现,其实Spring Cloud是提供了多种客户端调用的组件,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使 ...
- PHP入门怎么选?大学生适合学习吗?
大学毕业,面对竞争激烈的社会,理想总是很丰满,现实却很残酷.在硕士.博士都随处可见的今天,本科和大专文凭就显得苍白无力,在面试官问你"有没有工作经验"的时候,你是不是只想起实习期间 ...
- Tp3.2 和 Tp5.0之间的区别
5.0版本和之前版本的差异较大,本篇对熟悉3.2版本的用户给出了一些5.0的主要区别. URL和路由 5.0的URL访问不再支持普通URL模式,路由也不支持正则路由定义,而是全部改为规则路由配合变量规 ...
- 两个实用linux小工具
使用 sshpass 工具来做名密码输入 使用 alias 别名来做成命令语句. Linux命令之非交互SSH密码验证-sshpass ssh登陆不能在命令行中指定密码.sshpass的出现,解决了这 ...
- 初识CSS
css解释 css样式: css是英文Cascading Style Sheets的缩写,称为层叠样式表,用于对页面进行美化,CSS的可以使页面更加的美观.基本上所有的html页面都或多或少的使用cs ...
- java设计模式—多工厂模式
概念 多个工厂模式,是对普通工厂方法的改进,在普通工厂模式中,如果字符串传递出错,则不能正 确创建对象,而多个工厂模式是提供多个工厂方法,分别创建对象. 多个工厂模式关 ...
- 电脑创建WIFI/无线热点之后, 手机QQ能上浏览器不能上网
这个完全是个人经验,绝对原创,请尊重博主原创权,转载请注明转于此博客. 问题如题,大家电脑创建无线热点之后, 有的人手机会出现QQ,微信能上网, 但是浏览器或者基于浏览器的那些比如应用商店不能上网, ...