HDU2527:Safe Or Unsafe(哈弗曼树)
12
helloworld
66
ithinkyoucandoit
yes
一道简单的哈弗曼树,一开始没看懂题意,经过别人告诉我题意,原来只是一道这么简单的哈夫曼树,题目是要求除了叶子节点外的所有节点权值之和,正好数据结构刚刚学了哈夫曼树,趁热打铁。
要注意的是,如果在字符只有一种的情况下,哈夫曼树是建不起来的,要特殊处理
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std; const int L = 1000000+10;
const int inf = 1<<30;
char str[L];
struct kode
{
int num;
char c;
} b[L<<2]; struct node
{
int wei,parent,lson,rson,cover;
char data;
} a[L<<2]; int main()
{
int i,j,sum,t,len,lb;
char ch;
scanf("%d",&t);
while(t--)
{
scanf("%d%s",&sum,str);
len = strlen(str);
sort(str,str+len);
for(i = 0; i<len<<2; i++)
{
a[i].cover = a[i].lson = a[i].rson = a[i].parent = a[i].wei = b[i].num = 0;
a[i].data = b[i].c = '\0';
}
lb = 0;
b[lb].num = 1;
b[lb].c = ch = str[0];
for(i = 1; i<len; i++)
{
if(str[i] == ch)
b[lb].num++;
else
{
lb++;
ch = str[i];
b[lb].c = ch;
b[lb].num = 1;
}
}
if(lb == 0)//只有一种类型的字符,直接比较
{
if(b[lb].num<=sum)
printf("yes\n");
else
printf("no\n");
continue;
}
lb++;
int m = lb*2-1;
for(i = 0; i<lb; i++)
{
a[i].data = b[i].c;
a[i].wei = b[i].num;
}
for(i = 0; i<lb; i++)//建立哈夫曼树
{
int m1 = inf,m2 = inf;
int x = 0,y = 0;
for(j = 0; j<lb+i; j++)
{
if(a[j].wei<m1 && !a[j].cover)
{
m2 = m1;
m1 = a[j].wei;
y = x;
x = j;
}
else if(a[j].wei<m2 && !a[j].cover)
{
m2 = a[j].wei;
y = j;
}
}
a[x].parent = lb+i;
a[y].parent = lb+i;
a[lb+i].lson = x;
a[lb+i].rson = y;
a[lb+i].wei = a[x].wei+a[y].wei;
a[x].cover = a[y].cover = 1;
}
int ans = 0;
for(i = lb; i<2*lb-1; i++)//求除了叶子节点外其他所有节点的权值和
ans+=a[i].wei;
if(ans<=sum)
printf("yes\n");
else
printf("no\n");
} return 0;
}
HDU2527:Safe Or Unsafe(哈弗曼树)的更多相关文章
- K:哈弗曼树
相关介绍: 树形结构除了应用于查找和排序等操作时能调高效率,它在信息通讯领域也有着广泛的应用.哈弗曼(Huffman)树就是一种在编码技术方面得到广泛应用的二叉树,它同时也是一种最优二叉树. 哈弗曼 ...
- SLT 优先队列 哈弗曼树最小带权路径
与普通的队列不同,普通的队列是先进先出的,而优先队列出队的顺序不是先进先出,而是大(或者小)元素先出队,需要#include <queue> 成员函数 成员函数 作用 empty() 判断 ...
- java实现哈弗曼树
O(∩_∩)O~~ 概述 我想学过数据结构的小伙伴一定都认识哈弗曼,这位大神发明了大名鼎鼎的“最优二叉树”,为了纪念他呢,我们称之为“哈弗曼树”.哈弗曼树可以用于哈弗曼编码,编码的话学问可就大了,比如 ...
- 哈弗曼树的理解和实现(Java)
哈弗曼树概述 哈弗曼树又称最优树,是一种带权路径长度最短的树,在实际中有广泛的用途.哈弗曼树的定义,涉及路径.路径长度.权等概念.哈弗曼树可以用于哈弗曼编码,用于压缩,用于密码学等. 哈弗曼树的一些定 ...
- PKU 1521 Entropy(简单哈弗曼树_水过)
题目大意:原题链接 给你一个字符串,首先是计算出一个按正常编码的编码长度,其次是计算出一个用霍夫曼编码的编码长度,最后求正常编码的长度除以霍夫曼编码长度的比值,保留一位小数. 解题思路:需要知道 1. ...
- POJ 3253 Fence Repair(简单哈弗曼树_水过)
题目大意:原题链接 锯木板,锯木板的长度就是花费.比如你要锯成长度为8 5 8的木板,最简单的方式是把21的木板割成13,8,花费21,再把13割成5,8,花费13,共计34,当然也可以先割成16,5 ...
- Python 数据结构与算法 —— 哈弗曼树
1. 从扩充二叉树到哈弗曼树 扩充二叉树:对二叉树 T,加入足够多的新叶节点(而不是任意),使 T 的原有结点都变成度数为 2 的分支节点,得到的二叉树称为 T 的扩充二叉树. 对于扩充二叉树而言, ...
- HDU-2527 Safe Or Unsafe
http://acm.hdu.edu.cn/showproblem.php?pid=2527 建哈夫曼树,哈夫曼编码,求wpl值. Safe Or Unsafe Time Limit: 2000/10 ...
- java实现哈弗曼树和哈夫曼树压缩
本篇博文将介绍什么是哈夫曼树,并且如何在java语言中构建一棵哈夫曼树,怎么利用哈夫曼树实现对文件的压缩和解压.首先,先来了解下什么哈夫曼树. 一.哈夫曼树 哈夫曼树属于二叉树,即树的结点最多拥有2个 ...
随机推荐
- 记录:sea.js和require.js配置 与 性能对比
最近有点忙,很久无写博客,记录一下之前的配置require.js和sea.js的配置.(有误有望提出 require.js 文件目录 /app(项目使用js) /lib(require.js jq存放 ...
- JS笔记 入门第一
WHY? 一.你知道,为什么JavaScript非常值得我们学习吗? 1. 所有主流浏览器都支持JavaScript. 2. 目前,全世界大部分网页都使用JavaScript. 3. 它可以让网页呈现 ...
- USB3.0 和usb 2.0的区别
USB3.0拥有10倍于USB2.0的速度,可惜DIY“江湖”险恶,如果咱们不掌握如何识别USB3.0的方法,很容易被JS忽悠.何况,USB3.0主板不等于USB3.0机箱,很多朋友在选购时都忽略了一 ...
- Inlay技术要求
物理特性: 项目 要求内容 备考 基准值 公差 INLAY尺寸 A(长) 480mm ±0.5mm B(宽) 380mm ±0.5mm 线圈位置 C(天地位置) 16.05mm ±0.2mm D(左右 ...
- c++ bitset使用
A bitset is a special container class that is designed to store bits (elements with only two possibl ...
- DCI架构
提出的文章:DCI架构:一个面向对象编程的新图景 http://wenku.baidu.com/view/a7b5e401de80d4d8d15a4fed.html http://www.360doc ...
- HDU 3415 Max Sum of Max-K-sub-sequence
题目大意:找长度不超过k的最大字段和. 题解:单调队列维护之前k的最小值,思想是对于每一个入队的新元素,如果队尾元素比其大则一直删减,然后插入新元素,对于队首的元素若与当前枚举两相差超过k则直接删去. ...
- c#第五次作业---正文提取
1.正文文本 1.正文文本 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFC ...
- 软碟通UltraISO 9.65.3237官方注册版
UltraISO软碟通是一款功能强大.方便实用.老牌优秀的光盘映像文件制作/编辑/转换工具:可直接编辑ISO文件,从ISO中提取文件和目录:也可从CD – ROM制作光盘映像或者将硬盘上的文件制作成I ...
- 面向对象之静态方法(static)和实例化方法的区别
这是一个经常被时时提出来的问题,很多时候我们以为理解了.懂了,但深究一下,我们却发现并不懂. 方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简 ...