【NOI】荷马史诗
追逐影子的人,自己就是影子 ——荷马
Allison最近迷上了文学。她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的《荷马史诗》。但是由《奥德赛》和《伊利亚特》组成的鸿篇巨制《荷马史诗》实在是太长了,Allison想通过一种编码方式使得它变得短一些。
一部《荷马史诗》中有 n 种不同的单词,从 1 到 n 进行编号。其中第 i 种单词出现的总次数为 w[i] 。Allison想要用 k 进制串 s[i] 来替换第 i 种单词,使得其满足如下要求:
对于任意的 1<=i,j<=n , i<>j ,都有: s[i] 不是 s[j] 的前缀。
现在Allison想要知道,如何选择 s[i] ,才能使替换以后得到的新的《荷马史诗》长度最小。在确保总长度最小的情况下,Allison还想知道最长的 s[i] 的最短长度是多少?
一个字符串被称为 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 个整数,为保证最短总长度的情况下,最长字符串 s[i] 的最短长度。

题目简述
k-进制哈夫曼编码
题解
容易得到每次都是选取最小的k个合并,如果大小相同,要选取编码长度短的
开始要先把一些合并起来,才能使答案最优,原因就不赘述了
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<map>
#include<vector>
#include<set>
#define il inline
#define re register
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int N=;
typedef long long ll;
int n,k,hs;
struct data{int w;ll v;} h[N];
il ll read(){
re ll hs=;re char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)){
hs=(hs<<)+(hs<<)+c-'';
c=getchar();
}
return hs;
}
il bool cmp(re data a,re data b){
return (a.v==b.v)?(a.w<b.w):(a.v<b.v);
}
il void swim(re int p){
re int q=p>>;re data a=h[p];
while(q>&&cmp(a,h[q])){
h[p]=h[q];p=q;q=p>>;
}
h[p]=a;
}
il void sink(re int p){
re int q=p<<;re data a=h[p];
while(q<=hs){
if(q<hs&&cmp(h[q+],h[q])) q++;
if(cmp(a,h[q])) break;
h[p]=h[q];p=q;q=p<<;
}
h[p]=a;
}
il void insert(re data v){
h[++hs]=v;swim(hs);
}
il void pop(){
h[]=h[hs--];sink();
}
int main(){
n=read();k=read();
for(int i=;i<=n;i++){
h[i].v=read();
h[i].w=;
}
sort(h+,h+n+,cmp);hs=n;
re ll ans=,cnt=;
re int maxn;
if((n-)%(k-)>){
for(int i=;i<=(n-)%(k-)+;i++){
cnt+=h[].v;
// print();
pop();
}
insert((data){,cnt});
ans=cnt;
}
while(hs>){
cnt=;maxn=;
for(int i=;i<=k;i++){
cnt+=h[].v;
maxn=max(maxn,h[].w);
pop();
// print();
}
insert((data){maxn+,cnt});
// print();
ans+=cnt;
}
cout<<ans<<endl<<h[].w-<<endl;
return ;
}
【NOI】荷马史诗的更多相关文章
- NOI 2015 荷马史诗【BZOJ 4198】k叉Huffman树
		
抱歉因为NOIP集训,好长时间没再写题解了. NOI 2015也就只有这道题一看就能懂了-- 4198: [Noi2015]荷马史诗 Time Limit: 10 Sec Memory Limit: ...
 - [NOI 2015]荷马史诗
		
Description 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由& ...
 - [BZOJ4198][Noi2015]荷马史诗
		
4198: [Noi2015]荷马史诗 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 700 Solved: 365[Submit][Status] ...
 - 【NOI2015】荷马史诗
		
追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛>和& ...
 - bzoj4198 荷马史诗 哈夫曼编码
		
逐影子的人,自己就是影子. --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛>和&l ...
 - bzoj 4198: [Noi2015]荷马史诗
		
Description 追逐影子的人,自己就是影子. --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由& ...
 - [BZOJ4198] [Noi2015] 荷马史诗 (贪心)
		
Description 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是 ...
 - [Noi2015]荷马史诗
		
来自FallDream的博客,未经允许,请勿转载,谢谢. 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的 ...
 - BZOJ_4198_[Noi2015]荷马史诗_huffman实现
		
BZOJ_4198_[Noi2015]荷马史诗_huffman实现 题意: Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗> ...
 
随机推荐
- 记一次eslint规则配置
			
{ // 环境定义了预定义的全局变量. "env": { //环境定义了预定义的全局变量.更多在官网查看 "browser": true, "node ...
 - 配置独立于系统的PYTHON环境
			
配置独立于系统的PYTHON环境 python 当前用户包 一种解决方案是在利用本机的python环境的基础上,将python的包安装在当前user的.local文件夹下 一共有两种方式来实现pip的 ...
 - 来源自rnnoise,但非rnn
			
很快又一年过去了. 自学音频算法也近一年了. 不记得有多少个日日夜夜, 半夜醒来,就为验证算法思路. 一次又一次地改进和突破. 傻逼样的坚持,必然得到牛逼样的结果. 这一年,主要扎音频算法上. 经常有 ...
 - CocoStuff—基于Deeplab训练数据的标定工具【三、标注工具的使用】
			
一.说明 本文为系列博客第三篇,主要展示COCO-Stuff 10K标注工具的使用过程及效果. 本文叙述的步骤默认在完成系列文章[二]的一些下载数据集.生成超像素处理文件的步骤,如果过程中有提示缺少那 ...
 - 高可用OpenStack(Queen版)集群-1. 集群环境
			
参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...
 - 理解粒子滤波(particle filter)
			
1)初始化阶段-提取跟踪目标特征 该阶段要人工指定跟踪目标,程序计算跟踪目标的特征,比如可以采用目标的颜色特征.具体到Rob Hess的代码,开始时需要人工用鼠标拖动出一个跟踪区域,然后程序自动计算该 ...
 - MCS锁——可伸缩的自旋锁
			
在编写并发同步程序的时候,如果临界区非常小,比如说只有几条或几十条指令,那么我们可以选择自旋锁(spinlock).使用普通的互斥锁会涉及到操作系统的调度,因此小临界区一般首选自旋锁.自旋锁的工作方式 ...
 - Babel 入门教程
			
Babel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行. 这意味着,你可以现在就用 ES6 编写程序,而不用担心现有环境是否支持.下面是一个例子. // 转码前 inpu ...
 - RN 离线包集成后需要注意的一些问题
			
1.ReactNative 开发中如何去掉iOS状态栏的"Loading from..." 等淡黑色的弹框,很难看? 在 AppDelegate.h 中引入: #import &l ...
 - yarn (npm) 切换设置镜像源
			
设置镜像源 1.查看一下当前源 yarn config get registry 2.切换为淘宝源 yarn config set registry https://registry.npm.taob ...