LA 6533 Inverting Huffman 构造+贪心

题意:给定哈夫曼树的n个叶子节点距离根的距离,求文本至少需要多少个字符可以建出这样的哈夫曼树

思路:策略:对于第i层的叶子节点,赋值为i+1层的节点中权值最大的点这种情况下字符数最少。详见代码:

/*********************************************************
  file name: LA6533.cpp
  author : kereo
  create time:  2015年02月07日 星期六 22时05分45秒
*********************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
const int sigma_size=26;
const int N=100+50;
const int MAXN=100000+50;
const int inf=0x3fffffff;
const double eps=1e-8;
const int mod=1000000000+7;
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define PII pair<int, int>
#define mk(x,y) make_pair((x),(y))
int n;
ll step;
int a[N];
priority_queue<ll>Q1,Q2;
void init(){
    while(!Q1.empty())
        Q1.pop();
    while(!Q2.empty())
        Q2.pop();
    step=1;
    memset(a,0,sizeof(a));
}
int main(){
    while(~scanf("%d",&n)){
        init();
        for(int i=1;i<=n;i++){
            int x;
            scanf("%d",&x);
            a[x]++;
        }
        ll ans=0;
        for(int i=50;i>=1;i--){
            if(a[i]){
                while(a[i]){
                    Q1.push(step);
                    ans+=step;
                    a[i]--;
                }
            }
            while(Q1.size()>1){
                step=max(step,Q1.top());
                ll tmp=Q1.top(); Q1.pop(); //要long long
                step=max(step,Q1.top());
                tmp+=Q1.top(); Q1.pop();
                Q2.push(tmp);
            }
            if(Q1.size())
                step=max(step,Q1.top());
            while(Q2.size()){
                Q1.push(Q2.top());
                Q2.pop();
            }
        }
        printf("%lld\n",ans);
    }
	return 0;
}
时间: 2024-10-12 12:34:28

LA 6533 Inverting Huffman 构造+贪心的相关文章

LA 6979 Known Notation 构造+贪心 铜牌题

6979 Known NotationDo you know reverse Polish notation (RPN)? It is a known notation in the area of mathematics andcomputer science. It is also known as postfix notation since every operator in an expression follows allof its operands. Bob is a stude

【NOI2015】荷马史诗[Huffman树+贪心]

#130. [NOI2015]荷马史诗 统计 描述 提交 自定义测试 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛>和<伊利亚特>组成的鸿篇巨制<荷马史诗>实在是太长了,Allison 想通过一种编码方式使得它变得短一些. 一部<荷马史诗>中有 nn 种不同的单词,从 11 到 nn 进行编号.其中第 ii 种单词出现的总

Codeforces 432E Square Tiling(构造+贪心)

我们通常这么写 using (SqlDataReader drm = sqlComm.ExecuteReader()) { drm.Read();//以下把数据库中读出的Image流在图片框中显示出来. MemoryStream ms = new MemoryStream((byte[])drm["Logo"]); Image img = Image.FromStream(ms); this.pictureBox1.Image = img; } 我的写数据 private void b

GCJ 2009 Round2 A 构造贪心策略

题意: 给你一个n?n的元素只为0或1的矩阵,要把该矩阵通过行交换变为上三角矩阵,且交换方式只能为相邻行交换.问最小的交换步数是多少? 思路: 首先这个行的利用价值就是最右边的1位置是多少,直接把行抽象为最右边1的数字即可.注意:这里WA了一发,没有注意数字要初始化为0.无论多么简单,写完之后检查代码且保证逻辑没有一丝错误十分重要! 这个题主要的是构造贪心的法则:题中只需要满足第一行的数字小于1,第二行的数字小于2,-..,第n行的数字小于n.那么就从第一行开始,一行一行的来看,注意若当前行的数

BZOJ 3704(昊昊的机油之GRST-维护构造贪心解)

3704: 昊昊的机油之GRST Time Limit: 10 Sec  Memory Limit: 1024 MB Submit: 47  Solved: 15 [Submit][Status] Description 昊昊有个好机油,他就是传说中的着力点.现在昊昊获得了一份长度为n的GRST牌(mod 4 意义下),打算作为送给好机油的生日礼物(不是在2月的么).但是,昊昊深知他的机油是个神犇,作为数字控的他,只会喜欢特定的序列.但是昊昊不怕,他可以使用一次菲亚特(他的机油最喜欢的大招),将

UVa 1611 Crane (构造+贪心)

题意:给定一个序列,让你经过不超过9的6次方次操作,变成一个有序的,操作只有在一个连续区间,交换前一半和后一半. 析:这是一个构造题,我们可以对第 i 个位置找 i 在哪,假设 i  在pos 位置,那么如果 (pos-i)*2+i-1 <= n,那么可以操作一次换过来, 如果不行再换一种,如果他们之间元素是偶数,那么交换 i - pos,如果是奇数,交换 i - pos+1,然后再经过一次就可以换到指定位置. 代码如下: #pragma comment(linker, "/STACK:1

2014-2015 CT S02E10 C题 Coin Graph 构造+贪心

题意:给定一个数s,构造一个无向图,使得任意两点的最短路径和为s. 思路:二分找到n,满足n×(n-1)/2<=s,且n尽可能大.这样的图,相当于n个点每两个点都连一条边.窝们考虑这样一种构造方法, 假设现在有n个点,我们按照逆时针方向(顺时针也行)排序编号,那么我们间隔删去不相邻点的的边,比如5个点,我们删去 1--3,1--4,...,1--n-2,1---n-1,保留2,删3--5,3--6,...3--n-2,3----n-1,保留4,删5--7,5--8,...,5--n-1.这样可以

LA 4254 处理器(二分+贪心)

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2255 题意: 有n个任务,每个任务有3个参数ri,di和wi,表示必须在时刻[ri,di]之内执行,工作量为wi.处理器的速度可以为任意值,任务不一定要连续执行,可以分成若干块,求最大速度的最小值. 思路: 最大值的最小值问题可以考虑用二分法来做. 这道题目怎么判断速度合法是

CF.911F.Tree Destruction(构造 贪心)

题目链接 \(Description\) 一棵n个点的树,每次可以选择树上两个叶子节点并删去一个,得到的价值为两点间的距离 删n-1次,问如何能使最后得到的价值最大,并输出方案 \(Solution\) 树上距离,求最大,可以考虑下树的直径 假如已知树的直径u->v,那么任意一点x到达其他点的最远距离就是u,v中一点(如果不是这样,那直径一定可以更长而不是uv) 假设x距u最远,那肯定是删x 删直径上的点(直径端点)会导致一些点取不到最远距离 既然这样按顺序删非直径上的点,最后删直径端点 #in