失去了以前用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的更多相关文章

  1. 贪心(哈夫曼树):HDU 5884 sort

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA2QAAAKACAIAAAB8KCy/AAAgAElEQVR4nOy9a5Adx3UmWL+kHxuekU ...

  2. CF 463A && 463B 贪心 && 463C 霍夫曼树 && 463D 树形dp && 463E 线段树

    http://codeforces.com/contest/462 A:Appleman and Easy Task 要求是否全部的字符都挨着偶数个'o' #include <cstdio> ...

  3. 九度OJ 1172:哈夫曼树 (贪心)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6701 解决:2954 题目描述: 哈夫曼树,第一行输入一个数n,表示叶结点的个数.需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结 ...

  4. bzoj 4198: [Noi2015]荷马史诗【哈夫曼树+贪心】

    和合并果子类似(但是是第一次听说哈夫曼树这种东西) 做法也类似,就是因为不用知道树的形态,所以贪心的把最小的k个点合为一个节点,然后依次向上累加即可,具体做法同合并果子(但是使用优先队列 注意这里可能 ...

  5. [C++]哈夫曼树(最优满二叉树) / 哈夫曼编码(贪心算法)

    一 哈夫曼树 1.1 基本概念 算法思想 贪心算法(以局部最优,谋求全局最优) 适用范围 1 [(约束)可行]:它必须满足问题的约束 2 [局部最优]它是当前步骤中所有可行选择中最佳的局部选择 3 [ ...

  6. 牛客假日团队赛2 C 修围栏 ( 哈夫曼树,贪心)

    链接:https://ac.nowcoder.com/acm/contest/924/C 来源:牛客网 修围栏 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...

  7. 哈夫曼树---POJ3253

    http://poj.org/problem?id=3253 这就是 最典型的哈夫曼树的题型,我们就根据这道题学习一下哈夫曼树 这是最开始我们把21据下来之后我们据下8,然后再据下5得到34,可以看出 ...

  8. NOIP初赛 之 哈夫曼树

    哈夫曼树 种根据我已刷的初赛题中基本每套的倒数第五或第六个不定项选择题就有一个关于哈夫曼树及其各种应用的题,占:0-1.5分:然而我针对这个类型的题也多次不会做,so,今晚好好研究下哈夫曼树: 概念: ...

  9. 哈夫曼树Huffman

    哈夫曼树处理这样的一种问题: 给出一棵n个叶子的k叉树,每个叶子有一个权值wi,要求最小化∑wi*di di表示,第i个叶子节点到根节点的距离.(一般是边数) 处理方法比较固定. 贪心的思路:我们让权 ...

随机推荐

  1. pycharm安装教程,汉化教程,以及正版激活码---

    密钥在下面 安装过程 PyCharm2019本地下载: http://www.100c1.com/upload/default/20190420/1c08a3209029093a8b34df941f1 ...

  2. C 语言实例 - 判断正数/负数

    C 语言实例 - 判断正数/负数 用户输入一个数字,判断该数字是正数还是负数或是零. 实例 #include <stdio.h> int main() { double number; p ...

  3. Java程序的运行机制和JVM

    1. Java语言比较特殊, 由Java编写的程序需要经过编译步骤,但这个编译步骤不会产生特定平台的机器码,而是生成一种与平台无关的字节码(也就是.class文件).这种字节码不是可执行性的,必须使用 ...

  4. js 对象深拷贝

    /* *p需要拷贝的对象 * */ var deepCopy=function(p, c) { var c = c || {}; for (var i in p) { if (typeof p[i] ...

  5. POJ3694 Network 边双缩点+LCA+并查集

    辣鸡错误:把dfs和ldfs搞混...QAQ 题意:给定一个无向图,然后查询q次,求每次查询就在图上增加一条边,求剩余割边的个数. 先把边双缩点,然后预处理出LCA的倍增数组: 然后加边时,从u往上跳 ...

  6. centOS6.5 安装后无法启动无线上网

    查看无线网卡型号:[root@mookee rtl8192se_linux_2.6.0019.1207.2010]# lspci |grep Network03:00.0 Network contro ...

  7. 程序运行过程中遇到“ORA-03114: not connected to ORACLE”的问题解决

    c#,winform程序,数据批量入oracle库时用到DataAdaper的.FillSchema函数,如:da.FillSchema(dt2, SchemaType.Mapped); 程序运行一段 ...

  8. nginx的配置文件server_name的意义 location意义

    配置不同的域名      不同域名都可以有首地址 location   同一域名下   分发到不同的路径   或者项目

  9. java 通用查询框架Querydsl 简介

    Querydsl 是一个通用的查询框架,专注于通过JavaAPI构建类型安全的SQL查询说说Querydsl的优势吧: 1. Querydsl支持代码自动完成,因为才纯Java API编写查询,因此主 ...

  10. 第一课:K线

    1       K线是根据价格走势中形成的四个价位(开盘价.收盘价.最高价.最低价)绘制而成的.K线是最基本的描述股价涨跌的表现符号(记录某种股票一天的价格变动情况). K线构造的四个价格因素:开盘价 ...