【贪心 哈夫曼树】bzoj2923: [Poi1998]The lightest language
失去了以前用STL乱搞的能力……
题目描述
语言也是数学上经常研究的一种数据。
给出数学上关于语言的如下定义:
- 字母表:大小为 K 的字母表是一个由 K 不同的字符组成的集合。
- 单词:长度为 m 的单词是以 m 个字母表中的字符组成的字符串。
- 语言:语言是由若干个单词组成的集合。
- 非前缀的:一种语言是非前缀的,当且仅当其中任意两个单词不存在前缀关系。
现在每个字母表中的字母有一个权值,单词的权值是单词中每个字母的权值和,语言的权值是单词的权值之和。
例如:
K=2,字母a权值为 2,字母b权值为 5,字符串aba权值为 9。
语言 {ab,aba,b} 不是非前缀的,而非前缀的语言 {aa,ab,b} 权值是 16。
给出n,K,每个字母的权值 Wi,求包含 n 个单词的非前缀语言中最小的权值是多少。
数据范围
对于 20% 的数据,n,K≤5
对于另 30% 的数据,wi=1
对于另 30% 的数据,K=2
对于所有数据,2≤n≤10000,2≤K≤26,1≤wi≤10000
时间限制 1s
空间限制 256 MB
题目分析
整个单词树可以看做trie的样子,

那么我的第一思路就是在这个tire上面树形dp……
既然要dp那么肯定要涉及到开数组空间的问题。
注意到若一层能够“铺满”所有n个节点,那么往下编码是一定不更优的。所以最大情况是补成一个满二叉树。
但是这个数据范围对于树上背包来说不对啊……
于是就活生生卡住一个小时。
回过头来看这个问题:非前缀;最小编码和……
这是个类哈夫曼树的问题啊。
与常规的哈夫曼问题不同,此题既然确定个数而加权不同,就可以从树根往下处理。
于是乎,这么一个贪心扩展的过程,就可以用multiset来维护……
最后STL的细节问题需要注意一下。
#include<bits/stdc++.h>
typedef long long ll;
const int maxn = ; ll sum,ans;
int n,k,w[maxn];
std::multiset<ll> s; int read()
{
char ch = getchar();
int num = ;
bool fl = ;
for (; !isdigit(ch); ch = getchar())
if (ch=='-') fl = ;
for (; isdigit(ch); ch = getchar())
num = (num<<)+(num<<)+ch-;
if (fl) num = -num;
return num;
}
int main()
{
n = read(), k = read(), ans = 1ll<<;
for (int i=; i<=k; i++)
w[i] = read(), sum += w[i], s.insert(w[i]);
for (ll cnt=sum; cnt<ans;)
{
if (s.size()==n){
if (cnt < ans) ans = cnt;
else break;
}
std::multiset<ll>::iterator p = s.begin();
cnt += sum+(*p)*k;
for (int i=; i<=k; i++)
s.insert(w[i]+*p);
cnt -= *p, s.erase(p);
37 while (s.size() > n)
38 cnt -= *s.rbegin(), s.erase(--s.end());
}
printf("%lld\n",ans);
return ;
}
END
【贪心 哈夫曼树】bzoj2923: [Poi1998]The lightest language的更多相关文章
- 贪心(哈夫曼树):HDU 5884 sort
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA2QAAAKACAIAAAB8KCy/AAAgAElEQVR4nOy9a5Adx3UmWL+kHxuekU ...
- CF 463A && 463B 贪心 && 463C 霍夫曼树 && 463D 树形dp && 463E 线段树
http://codeforces.com/contest/462 A:Appleman and Easy Task 要求是否全部的字符都挨着偶数个'o' #include <cstdio> ...
- 九度OJ 1172:哈夫曼树 (贪心)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6701 解决:2954 题目描述: 哈夫曼树,第一行输入一个数n,表示叶结点的个数.需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结 ...
- bzoj 4198: [Noi2015]荷马史诗【哈夫曼树+贪心】
和合并果子类似(但是是第一次听说哈夫曼树这种东西) 做法也类似,就是因为不用知道树的形态,所以贪心的把最小的k个点合为一个节点,然后依次向上累加即可,具体做法同合并果子(但是使用优先队列 注意这里可能 ...
- [C++]哈夫曼树(最优满二叉树) / 哈夫曼编码(贪心算法)
一 哈夫曼树 1.1 基本概念 算法思想 贪心算法(以局部最优,谋求全局最优) 适用范围 1 [(约束)可行]:它必须满足问题的约束 2 [局部最优]它是当前步骤中所有可行选择中最佳的局部选择 3 [ ...
- 牛客假日团队赛2 C 修围栏 ( 哈夫曼树,贪心)
链接:https://ac.nowcoder.com/acm/contest/924/C 来源:牛客网 修围栏 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...
- 哈夫曼树---POJ3253
http://poj.org/problem?id=3253 这就是 最典型的哈夫曼树的题型,我们就根据这道题学习一下哈夫曼树 这是最开始我们把21据下来之后我们据下8,然后再据下5得到34,可以看出 ...
- NOIP初赛 之 哈夫曼树
哈夫曼树 种根据我已刷的初赛题中基本每套的倒数第五或第六个不定项选择题就有一个关于哈夫曼树及其各种应用的题,占:0-1.5分:然而我针对这个类型的题也多次不会做,so,今晚好好研究下哈夫曼树: 概念: ...
- 哈夫曼树Huffman
哈夫曼树处理这样的一种问题: 给出一棵n个叶子的k叉树,每个叶子有一个权值wi,要求最小化∑wi*di di表示,第i个叶子节点到根节点的距离.(一般是边数) 处理方法比较固定. 贪心的思路:我们让权 ...
随机推荐
- 教程 | Linux常用命令大全
Linux常用命令 目录操作命令 ls 命令名称:ls 命令英文原意:list 命令所在路径:/bin/ls 执行权限:所有用户 功能描述:显示目录文件 ls (显示当前目录下文件) ls 目录名 ( ...
- UVa 11168(凸包、直线一般式)
要点 找凸包上的线很显然 但每条线所有点都求一遍显然不可行,优化方法是:所有点都在一侧所以可以使用直线一般式的距离公式\(\frac{|A* \sum{x}+B* \sum{y}+C*n|}{\sqr ...
- 删除vi编辑产生的.swp文件(linux编辑文件没有退出时直接关闭程序产生的临时文件)
关于swp文件 使用vi,经常可以看到swp这个文件,那这个文件是怎么产生的呢,当你打开一个文件,vi就会生成这么一个.(filename)swp文件以备不测(不测下面讨论),如果你正常退出,那么这个 ...
- DotNetAnywhere
DotNetAnywhere:可供选择的 .NET 运行时 原文 : DotNetAnywhere: An Alternative .NET Runtime作者 : Matt Warren译者 : ...
- js得到当前页面的url信息
所有的代码都是可用,而且附了图片的,不过是直接用我自己的文章地址,所以有些显示的有点奇怪. 大家可以找个网址试试代码是否可行. 1,设置或获取对象指定的文件名或路径. console.log(wind ...
- Spring Aspect 获取请求参数
切片(Aspect)也就是Spring AOP 实现Aspect的主要步骤: 1.在哪里切入 .在哪个方法起作用 .什么时候起作用 2.起作用的时候执行什么处理逻辑 下面是代码实现 /** * 切片A ...
- 使用javaMail发送简单邮件
参考网页:http://blog.csdn.net/xietansheng/article/details/51673073package com.bfd.ftp.utils; import java ...
- JavaScript 事件对象event
什么是事件对象? 比如当用户单击某个元素的时候,我们给这个元素注册的事件就会触发,该事件的本质就是一个函数,而该函数的形参接收一个event对象. 注:事件通常与函数结合使用,函数不会在事件发生前被执 ...
- vue-cli 该如何正确打包iconfont?
其实这种问题应该问google的: got wrong bootstrap font path after building · Issue #166 · vuejs-templates/webpac ...
- 3D OpenGL ES
什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库. 为桌面版本OpenGL 的一个子集. ...