Safe Or Unsafe

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1332    Accepted Submission(s): 524

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
 
Source
 
Recommend
gaojie   |   We have carefully selected several similar problems for you:  2526 2522 2523 2524 2525 

 
  数据结构:哈夫曼树
  这道题考察的是数据结构中的哈夫曼树。
  做法是先根据输入的字符串str确定其叶子节点及其各叶子节点的权值,然后创建哈夫曼树,再根据哈夫曼树求每一个叶子节点的哈夫曼编码。最后根据求得的哈夫曼编码(路径长度)和各叶子节点的权值求的这棵哈夫曼树的带权路径长度(WPL)。
  其中创建哈夫曼树和求哈夫曼编码都可以在数据结构的书上找到模板,你需要做的就是根据str确定叶子节点和权值以及求WPL(WPL即为最后要比较的值)。
  需要注意的是,当str只有一种字符的情况下,哈夫曼树是构造不起来的,需要特殊处理(直接比较)。一开始没有注意这个细节,提交总是WA,后来看了别人的解题报告才明白。
  这是我第一次做哈夫曼编码的题,模板没有自己写,但为开学数据结构这部分的学习打下了一个良好的基础,等学到这里了再细细深究。
  不费话了,上代码
 
 #include <iostream>
using namespace std;
#define MAXNODE 10010
struct HTNode{
char data; //节点值
double weight; //权重
int parent; //双亲节点
int lchild; //左孩子节点
int rchild; //右孩子节点
}ht[*MAXNODE-];
struct HCode{
char cd[MAXNODE];
int start;
}hcd[MAXNODE];
char str[MAXNODE];
void CreateHT(HTNode ht[],int n)
{
int i,j,k,lnode,rnode;
double min1,min2;
for(i=;i<*n-;i++) //所有节点的相关域置初值-1
ht[i].parent = ht[i].lchild = ht[i].rchild = -;
for(i=n;i<*n-;i++){ //构造哈夫曼树
min1 = min2 = ; //lnode和rnode为权重最小的两个节点位置
lnode = rnode =-;
for(k=;k<=i-;k++)
if(ht[k].parent == -){
if(ht[k].weight<min1){
min2 = min1;rnode = lnode;
min1 = ht[k].weight;lnode = k;
}
else if(ht[k].weight<min2){
min2 = ht[k].weight;rnode = k;
}
}
ht[i].weight = ht[lnode].weight + ht[rnode].weight;
ht[i].lchild = lnode;ht[i].rchild = rnode; //ht[i]作为双亲节点
ht[lnode].parent = i;ht[rnode].parent = i;
}
}
void CreateHCode(HTNode ht[],HCode hcd[],int n)
{
int i,f,c;
HCode hc;
for(i=;i<n;i++){ //根据哈夫曼树求哈夫曼编码
hc.start = n;c=i;
f = ht[i].parent;
while(f!=-){
if(ht[f].lchild == c)
hc.cd[hc.start--] = '';
else
hc.cd[hc.start--] = '';
c = f;f=ht[f].parent;
}
hc.start++;
hcd[i]=hc;
}
}
int main()
{
int n;
cin>>n;
while(n--){
int m;
cin>>m;
cin>>str;
int len = ;
for(int i=;str[i];i++){ //初始化ht[]哈夫曼树的叶子节点和权值
//ht[]有无存储str[i]
int j;
for(j=;j<len;j++)
if(str[i]==ht[j].data)
break;
if(j<len) continue; //已经存储了,退出本次循环
int count = ;
for(j=;str[j];j++){ //没存储,给ht[len]计数
if(str[i]==str[j])
count++;
}
ht[len].data = str[i];
ht[len++].weight = count;
}
//len--;
CreateHT(ht,len); //创建哈夫曼树
CreateHCode(ht,hcd,len); //根据哈夫曼树求哈夫曼编码
if(len==){ //只有一种字符的情况下,哈夫曼树是构造不起来的,特殊处理(直接进行比较)
if(ht[].weight<=m)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
continue;
}
int wpl = ;
for(int i=;i<len;i++){
wpl += (len-hcd[i].start+)*ht[i].weight;
}
//cout<<wpl<<endl;
if(wpl<=m)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return ;
}

Freecode : www.cnblogs.com/yym2013

hdu 2527:Safe Or Unsafe(数据结构,哈夫曼树,求WPL)的更多相关文章

  1. Safe Or Unsafe--hdu2527(哈夫曼树求WPL)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2527 用优先队列模拟 #include<iostream> #include<std ...

  2. HDU 5884 Sort (二分+k叉哈夫曼树)

    题意:n 个有序序列的归并排序.每次可以选择不超过 k 个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问 k最小是多少. 析:首先二分一下这个 k .然后在给定 k 的情况下, ...

  3. 数据结构-哈夫曼树(python实现)

    好,前面我们介绍了一般二叉树.完全二叉树.满二叉树,这篇文章呢,我们要介绍的是哈夫曼树. 哈夫曼树也叫最优二叉树,与哈夫曼树相关的概念还有哈夫曼编码,这两者其实是相同的.哈夫曼编码是哈夫曼在1952年 ...

  4. C#数据结构-赫夫曼树

    什么是赫夫曼树? 赫夫曼树(Huffman Tree)是指给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小.哈夫曼树(也称为最优二叉树)是带权路径长度最短的树,权值较大的结点 ...

  5. hdu 2527 Safe Or Unsafe (哈夫曼树)

    Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  6. hdu 2527 Safe Or Unsafe (优先队列实现Huffman)

    Safe Or UnsafeTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  7. hdu 5884 Sort 队列+多叉哈夫曼树

    Sort Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Des ...

  8. HDU 5884 Sort ——(K叉哈夫曼树)

    这题真心比较奥义,先见这个人的博客:http://blog.csdn.net/libin66/article/details/52565484 补0的方法是使得其满足成为满K叉树,而其博客中所说的“所 ...

  9. Android版数据结构与算法(七):赫夫曼树

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 近期忙着新版本的开发,此外正在回顾C语言,大部分时间没放在数据结构与算法的整理上,所以更新有点慢了,不过既然写了就肯定尽力将这部分完全整理好分享出 ...

随机推荐

  1. [Swift A] - Using Swift with Cocoa and Objective-C--Mix and Match

    Swift与Objective-C的兼容能力允许你在同一个工程中同时使用两种语言.你可以用这种叫做“mix and match”的特性来开发基于混合语言的应用.使用Swfit的最新特性--“mix a ...

  2. Spring 基于Aspectj切面表达式

    package com.proc; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; im ...

  3. 名词解释:alpha版、beta版、rc版的意思(转)

    很多软件在正式发布前都会发布一些预览版或者测试版,一般都叫“beta版”或者 “rc版”,特别是开源软件,甚至有“alpha版”,下面来解释一下各个版本的意思. alpha版:内部测试版.α是希腊字母 ...

  4. MyEclipse连接sqlserver2008具体流程

    参照这里: 图形连接  http://wenku.baidu.com/view/f50838086c85ec3a87c2c53a.html 还有查看的是这个:   2. 重新用Window验证方式登陆 ...

  5. Linux下SSH免密码登录(转)

    搭建hadoop集群的时候一定会用到的就是SSH免密码登录 [hadoop@hadoop1 ~]$ ssh-keygen -t rsa Generating public/private rsa ke ...

  6. window.onunload | window.onbeforeunload

    先引述一段jQuery 官方对于onunload的评述: The unload event is sent to the window element when the user navigates ...

  7. python --正则学习

    re的正则表达式语法    正则表达式语法表如下: re.match re.match 尝试从字符串的开始匹配一个模式,匹配成功返回match object,否则返回None. 如:下面的例子匹配第一 ...

  8. 手动集成OWIN

    1.Install-Package Microsoft.AspNet.Identity.Owin Owin的很大亮点之一就是它可以让我们的ASP.NET 网站摆脱IIS,但是毕竟大多数的ASP.NET ...

  9. sql2008拒绝了对对象 (数据库 ,架构'dbo')的SELECT权限

    连接sql2008的时候,出现了这种一直报权限错误:错误截图如下: 所见效果描述:在windows身份验证的 情况下登陆进去数据库的表都是可以打开的,当换到sa或者别的账号登陆进去的时候这个时候我们点 ...

  10. ubuntu下查找jdk安装位置

    which javac 返回/usr/bin/javac file /usr/bin/javac 返回/usr/bin/javac: symbolic link to `/etc/alternativ ...