Problem Description
Javac++ 一天在看计算机的书籍的时候,看到了一个有趣的东西!每一串字符都可以被编码成一些数字来储存信息,但是不同的编码方式得到的储存空间是不一样的!并且当储存空间大于一定的值的时候是不安全的!所以Javac++ 就想是否有一种方式是可以得到字符编码最小的空间值!显然这是可以的,因为书上有这一块内容--哈夫曼编码(Huffman Coding);一个字母的权值等于该字母在字符串中出现的频率。所以Javac++ 想让你帮忙,给你安全数值和一串字符串,并让你判断这个字符串是否是安全的?
 
Input
输入有多组case,首先是一个数字n表示有n组数据,然后每一组数据是有一个数值m(integer),和一串字符串没有空格只有包含小写字母组成!
 
Output
如果字符串的编码值小于等于给定的值则输出yes,否则输出no。
 
Sample Input
2
12
helloworld
66
ithinkyoucandoit
 
Sample Output
no
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(哈弗曼树)的更多相关文章

  1. K:哈弗曼树

    相关介绍:  树形结构除了应用于查找和排序等操作时能调高效率,它在信息通讯领域也有着广泛的应用.哈弗曼(Huffman)树就是一种在编码技术方面得到广泛应用的二叉树,它同时也是一种最优二叉树. 哈弗曼 ...

  2. SLT 优先队列 哈弗曼树最小带权路径

    与普通的队列不同,普通的队列是先进先出的,而优先队列出队的顺序不是先进先出,而是大(或者小)元素先出队,需要#include <queue> 成员函数 成员函数 作用 empty() 判断 ...

  3. java实现哈弗曼树

    O(∩_∩)O~~ 概述 我想学过数据结构的小伙伴一定都认识哈弗曼,这位大神发明了大名鼎鼎的“最优二叉树”,为了纪念他呢,我们称之为“哈弗曼树”.哈弗曼树可以用于哈弗曼编码,编码的话学问可就大了,比如 ...

  4. 哈弗曼树的理解和实现(Java)

    哈弗曼树概述 哈弗曼树又称最优树,是一种带权路径长度最短的树,在实际中有广泛的用途.哈弗曼树的定义,涉及路径.路径长度.权等概念.哈弗曼树可以用于哈弗曼编码,用于压缩,用于密码学等. 哈弗曼树的一些定 ...

  5. PKU 1521 Entropy(简单哈弗曼树_水过)

    题目大意:原题链接 给你一个字符串,首先是计算出一个按正常编码的编码长度,其次是计算出一个用霍夫曼编码的编码长度,最后求正常编码的长度除以霍夫曼编码长度的比值,保留一位小数. 解题思路:需要知道 1. ...

  6. POJ 3253 Fence Repair(简单哈弗曼树_水过)

    题目大意:原题链接 锯木板,锯木板的长度就是花费.比如你要锯成长度为8 5 8的木板,最简单的方式是把21的木板割成13,8,花费21,再把13割成5,8,花费13,共计34,当然也可以先割成16,5 ...

  7. Python 数据结构与算法 —— 哈弗曼树

    1. 从扩充二叉树到哈弗曼树 扩充二叉树:对二叉树 T,加入足够多的新叶节点(而不是任意),使 T 的原有结点都变成度数为 2 的分支节点,得到的二叉树称为 T 的扩充二叉树. 对于扩充二叉树而言, ...

  8. HDU-2527 Safe Or Unsafe

    http://acm.hdu.edu.cn/showproblem.php?pid=2527 建哈夫曼树,哈夫曼编码,求wpl值. Safe Or Unsafe Time Limit: 2000/10 ...

  9. java实现哈弗曼树和哈夫曼树压缩

    本篇博文将介绍什么是哈夫曼树,并且如何在java语言中构建一棵哈夫曼树,怎么利用哈夫曼树实现对文件的压缩和解压.首先,先来了解下什么哈夫曼树. 一.哈夫曼树 哈夫曼树属于二叉树,即树的结点最多拥有2个 ...

随机推荐

  1. windows下安装MySQLdb模块

    从http://www.codegood.com/downloads 下载mysqldb相应的exe文件直接安装. 我用的是MySQL-python-1.2.3.win32-py2.7.exe

  2. arm中的ldr指令

    label .equ 0x53000000 ldr r0, label : 将0x53000000地址处的值放入r0中 ldr r0, =label : 将0x53000000付值给r0.

  3. DropDownList控件学习

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  4. QT renered html for js

    voidMainWindow::on_pushButton_clicked() { QStringurl="http://www.baidu.com"; url="htt ...

  5. 获取WebView里的网页文本内容

    获取WebView里的网页文本内容,能够採用例如以下方法: public class ComJSInterface { public void loadHtmlContent(String conte ...

  6. 与一线Linux嵌入式开发project师的对话

    转:与一线Linux嵌入式开发project师的对话 陈project师一直做Linux的嵌入式开发.作为在开发一线的project师.他对非常多问题的看法可能更切合实际需求,于是,通过邮件.就嵌入式 ...

  7. Windows Server 2012 安装dll到GAC

    使用Windows管理员打开PowerShell: 运行以下命令: Set-location "c:\tools\gac" [System.Reflection.Assembly] ...

  8. C# Code Snip

    1.Tryf + TAB+TAB try { } finally { } 2.Prop+Tab+Tab public int MyProperty { get; set; } 3. #region + ...

  9. webform基础介绍及页面传值(session,cookie)、跳转页面

    一,IIS 1.首先知道IIS是个什么东西:它是web服务器软件,安装在服务器上,接受客户端发来的请求,并传送给服务器端,然后响应请求并送回给客户端.类似于饭店里的服务员. 2.会安装IIS——控制面 ...

  10. Oracle创建表、索引、主键、字段描述

    -- 创建表 create table SX04_LBALANCE ( YEAR VARCHAR2(10) not null, PROGRAMNO VARCHAR2(40) not null, FDA ...