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 ...
随机推荐
- SQL测试题
一.网上收集了一些测试题,对于掌握SQL查询语句. /* Navicat MySQL Data Transfer Source Server : lizebo's MYSQL Source Serve ...
- 匿名HTTP透明HTTP高匿HTTP区别
透明代理的意思是客户端根本不需要知道有代理服务器的存在,但是它传送的仍然是真实的IP.你要想隐藏的话,不要用这个. 普通匿名代理能隐藏客户机的真实IP,但会改变我们的请求信息,服务器端有可能会认为我们 ...
- MFC中小笔记(四)
12.编译透明化界面是出现 WS_EX_LAYERED AC_SRC_ALPHA ULW_ALPHA ULW_OPAQUE undeclared identifier ,搜索发现SDK版本过低. ...
- 51nod 1058 N的阶乘的长度 位数公式
1058 N的阶乘的长度基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注输入N求N的阶乘的10进制表示的长度.例如6! = 720,长度为3.Input输入N( ...
- 有关BOM头的一些知识
在psr开发标准中,有一条是讲的,php只能使用无bom的utf8格式 . 那么这个bom是几个意思. 说一些理论内容 . 在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK ...
- Web前端学习——HTML
HTML其实还是蛮容易学习的,无非就是一些标签.格式的填写,大学的时候也做过网站设计,所以这里主要记录一些常用的HTML标签.属性以及书写方法等. 一.常见HTML格式 主要包含文件type,html ...
- Atcoder R84 D Small Multiple
题意:给定一个正整数K,求K的倍数中,各位上的数字之和最小是多少? 思路非常巧妙,对于一个数,我们有定义两种改变方式: 1.加1,则数字之和+1(9的情况另行考虑) 2.乘10,数字之和不变 对于末位 ...
- 响应式框架Bootstrap栅格系统
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8&qu ...
- js 继承的简单易懂小例子
js 继承 今天主要说原型链继承.构造继承.组合继承三种常用继承方式,分享一下我的理解. 原型链继承例子1 //原型继承function A(name){ this.name = name;}func ...
- 将PDF文件中按页截取,并以流的形势返回给客户端
#需要用到pyPdf库 from pyPdf import PdfFileWriter,PdfFileReader from django.http import HttpResponse try: ...