BZOJ4198: [Noi2015]荷马史诗(哈夫曼树)
Submit: 1824 Solved: 983
[Submit][Status][Discuss]
Description
追逐影子的人,自己就是影子。 ——荷马
Input
输入文件的第 1 行包含 2 个正整数 n,k,中间用单个空格隔开,表示共有 n 种单词,需要使用 k 进制字符串进行替换。
Output
输出文件包括 2 行。
Sample Input
1
1
2
2
Sample Output
2
HINT
Source
把出现次树看做是点权,长度看做是点到根的路径长度
这个问题就转化成了哈夫曼树问题,不过是在$k$进制下的。
因此用有限队列维护,每次弹出前$k$个元素就好了
注意n-1 \pmod k-1 \not = 0$的时候需要补零
传说还有线性的算法?算了不学了
#include<cstdio> #include<vector> #include<algorithm> #include<cstring> #include<map> #include<cmath> #include<queue> #define int long long using namespace std; const int INF = 1e9 + 10; inline int read() {char c = getchar(); int x = 0, f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f; } int N, K; struct Node {int w, h;bool operator < (const Node &rhs) const{return w == rhs.w ? h > rhs.h : w > rhs.w;} }; priority_queue<Node> q; main() { N = read(); K = read();for(int i = 1; i <= N; i++) q.push((Node){read(), 1});int tot = N, ans = 0;if((N - 1) % (K - 1) != 0) tot += K - 1 - ((N - 1) % (K - 1));for(int i = 1; i <= tot - N; i++) q.push((Node) {0, 1});while(tot > 1) {int val = 0, mxh = 0;for(int i = 1; i <= K; i++) {Node top = q.top(); q.pop();val += top.w; mxh = max(mxh, top.h);}ans += val;q.push((Node){val, mxh + 1});tot -= K - 1;}printf("%lld\n%lld", ans, q.top().h - 1); }
转载于:https://www.cnblogs.com/zwfymqz/p/9270190.html
BZOJ4198: [Noi2015]荷马史诗(哈夫曼树)相关推荐
- [Huffman树] aw149. 荷马史诗(哈夫曼模型+贪心)
文章目录 1. 题目来源 2. 题目解析 1. 题目来源 链接:149. 荷马史诗 2. 题目解析 k叉哈夫曼树问题. n 个叶子节点合并成 1 个点,总共合并减少 n-1 个点,每次合并都会减少 ( ...
- bzoj 4198 [ Noi 2015 ] 荷马史诗 —— 哈夫曼编码(k叉哈夫曼树)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4198 第一次写哈夫曼树!看了很多博客. 哈夫曼树 & 哈夫曼编码:https://w ...
- [NOI2015]荷马史诗【哈夫曼编码】
[NOI2015]荷马史诗 推荐一篇题解 (感觉自己讲不清楚所以不如直接粘题解) 观察之后发现这就是哈夫曼编码,于是按照编码方式构造即可. #include <bits/stdc++.h> ...
- 【BZOJ4198】荷马史诗,贪心之k叉哈夫曼树
传送门 思路: 很早以前听说过这个题 据说是一个很强的贪心(?) 然后一上来就往贪心上去想--(其实一开始知道算法不是很好,因为你不会走弯路了) 发现这玩意好像是个合并果子的模型-- 也不知道是怎么转 ...
- NOI2015 荷马史诗
题目链接:戳我 首先看出来这是一个哈夫曼树! 然后就按照这里面哈夫曼树那一点说的,就可以A掉这个题啦 #include<iostream> #include<cstdio> # ...
- P2168 [NOI2015] 荷马史诗(哈夫曼编码树)
传送门 文章目录 题目描述 解析 细节 代码 题目描述 解析 其实就是构造一棵树 另所有带权点都为叶子节点 其代价为权值与深度的乘积 求最小代价及最小代价下的最小深度 可以看成一开始有n棵小树 每次把 ...
- 【Huffman树】【贪心】【NOI 2015】【bzoj 4198】荷马史诗
4198: [Noi2015]荷马史诗 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 127 Solved: 80 Description 追逐影子的 ...
- K叉哈夫曼树构造方法 O(N)
带权路径:是树中所有的叶结点的权值乘上其到根结点的路径长度. 哈夫曼树就是带权路径最小的树. 有n个数(即n个叶子节点),构造k叉(k>=2)哈夫曼树的方法: 构造哈夫曼树,其实就是不停的&qu ...
- 荷马史诗【k叉哈夫曼树】
题目描述 追逐影子的人,自己就是影子. --荷马 达达最近迷上了文学. 她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>. 但是由<奥德赛>和 ...
- 洛谷P2168 荷马史诗 [NOI2015]
题目描述 追逐影子的人,自己就是影子 --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛&g ...
最新文章
- npoi导出execl源码,vs2008实现,包括using库
- Mybatis【配置文件】就是这么简单
- 安卓环境搭建 SDK emulator directory is missing
- sklearn MLP(多层感知机、Multi-layer Perceptron)模型使用RandomSearchCV获取最优参数及可视化
- 自定义Spinner之IconSpinner
- 解决TextView排版混乱或者自动换行的问题
- Windows PE变形练手3-把通用模板机器码直接覆盖目标PE
- 人脸识别加VR技术 港媒:中国高科技加入“垃圾战”
- linux安装unzip及使用
- Community Server系列之三:页面间关系2[介绍]
- 第一次软工作业展示——潘学
- 关于一篇MSDN(January2006)上的一个XML操作--复制结点
- 中央民族大学计算机专业研究生,信息工程学院
- 复杂系统建模计算机仿真是干嘛的,复杂系统建模和 与仿真.ppt
- oracle可以只装客户端吗,我想在linux下只装oracle客户端行吗?怎么装?
- 利用动态数组生成魔方矩阵
- 基础回顾:测井曲线划分油、气、水层
- JAVA 下载Word文档
- excel冻结窗口_Excel之小功能
- 调用方法求出数组两个元素的和