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. textwrap——文本包裹和填充模块解析

    textwrap模块提供了两个函数wrap()和fill(),以及TextWrapper类,以及另外一个工具函数dedent().         wrap()以及fill()都可以用来格式化一大段文 ...

  2. windows下安装MySQLdb模块

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

  3. 斯坦福 IOS讲义 课件总结 二

    1,OC里面传参数个数不同,可以是两个完全不同的方法.如 - (void)addCard:(Card *)card atTop:(BOOL)atTop; - (void)addCard:(Card * ...

  4. Delphi 的动态数组

    传统的Pascal 语言其数组大小是预先确定的,当你用数组结构声明数据类型时,你必须指定数组元素的个数.专业程序员也许知道些许动态数组的实现技术,一般是采用指针,用手工分配并释放所需的内存. Delp ...

  5. Session()

    如何使用 Session Java Api 只给我们一种方式来 获取 当前会话相关的 session: HttpSession session = request.getSession(); //或 ...

  6. python数值计算模块NumPy scipy安装

    NumPy为Python提供了快速的多维数组处理的能力,而SciPy则在NumPy基础上添加了众多的科学计算所需的各种工具包,有了这两个库,Python就有几乎和Matlab一样的处理数据和计算的能力 ...

  7. HDU 1108 最小公倍数

    #include <cstdio> int gcd(int a,int b) { ) return a; else return gcd(b,a%b); } int main() { in ...

  8. 【企业库6】【日志应用程序块】实验2:创建和使用异步Trace Listener

    Lab 2: Create and Use an Asynchronous Trace Listener 实验2:创建和使用异步Trace Listener In this lab, you will ...

  9. JavaScript算法描述(一)

    function swap(arr,index1,index2){ var temp=arr[index1]; arr[index1]=arr[index2]; arr[index2]=temp; } ...

  10. if语句判断闰年、平年

     一.让用户输入一个年份,判断是否是闰年. 判断一个年份是否是闰年有两个条件 ①能被400整除:②能被4整除但是不能被100整除 Console.WriteLine("请输入年份:" ...