hdu 2527:Safe Or Unsafe(数据结构,哈夫曼树,求WPL)
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
12
helloworld
66
ithinkyoucandoit
yes
#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)的更多相关文章
- Safe Or Unsafe--hdu2527(哈夫曼树求WPL)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2527 用优先队列模拟 #include<iostream> #include<std ...
- HDU 5884 Sort (二分+k叉哈夫曼树)
题意:n 个有序序列的归并排序.每次可以选择不超过 k 个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问 k最小是多少. 析:首先二分一下这个 k .然后在给定 k 的情况下, ...
- 数据结构-哈夫曼树(python实现)
好,前面我们介绍了一般二叉树.完全二叉树.满二叉树,这篇文章呢,我们要介绍的是哈夫曼树. 哈夫曼树也叫最优二叉树,与哈夫曼树相关的概念还有哈夫曼编码,这两者其实是相同的.哈夫曼编码是哈夫曼在1952年 ...
- C#数据结构-赫夫曼树
什么是赫夫曼树? 赫夫曼树(Huffman Tree)是指给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小.哈夫曼树(也称为最优二叉树)是带权路径长度最短的树,权值较大的结点 ...
- hdu 2527 Safe Or Unsafe (哈夫曼树)
Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 2527 Safe Or Unsafe (优先队列实现Huffman)
Safe Or UnsafeTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- hdu 5884 Sort 队列+多叉哈夫曼树
Sort Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Des ...
- HDU 5884 Sort ——(K叉哈夫曼树)
这题真心比较奥义,先见这个人的博客:http://blog.csdn.net/libin66/article/details/52565484 补0的方法是使得其满足成为满K叉树,而其博客中所说的“所 ...
- Android版数据结构与算法(七):赫夫曼树
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 近期忙着新版本的开发,此外正在回顾C语言,大部分时间没放在数据结构与算法的整理上,所以更新有点慢了,不过既然写了就肯定尽力将这部分完全整理好分享出 ...
随机推荐
- linux(Centos)下编译安装gcc4.8.2
欢迎转载.转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/46811159 近期要用到c++ 11,所以没办法仅仅得把那台ce ...
- android TextView异常换行层次不齐的问题
关于TextView异常换行,参差不齐问题分析:每行的开头的第一个字符如果是字母,数字,标点符号以及特殊字符 可能是由于都是半角字符,所以需要转化成全角字符 解决方法是: public String ...
- ubuntu12.04(64位)下安装Adobe Flash Player
2012-06-14 10:10:37 第一步,去adobe官方网站就可以,使用方便,打开网站:http://get.adobe.com/cn/flashplayer/根据自己的版本下载需要的.本 ...
- Linux命令-帮助命令:man
man ls 查看ls命令的帮助信息(输出结果和less命令一样,需要空格,回车,,上箭头,下箭头,PgUp,PgDn,q等方式浏览) 注意:由于这个文件信息量比较大,需要查找某一个字符,输入/,输入 ...
- jQuery通过text值来设置选定,以及遍历select的选项个数和遍历
真是醉了,网上搜了很久,全都是千篇一律的. 大家都拷贝来拷贝去,全是错的. 通过text值来设置select选定 $("#CompanyID").find("option ...
- RESTful Web Service实战 小结1
1 REST的基本实现形式HTTP+URI+XML,但不是唯一形式.XML后来被Json格式替代.REST是一中架构风格(Representational State Transfer,表述性状态转移 ...
- angularAMD快速入门
ngularAMD是作者 marcoslin 使用 RequireJS + AngularJS开发的前端mvvm框架,因此你可以使用它快速创建一款Web App.他特别适合快速开发SPA应用,适当的和 ...
- shell 基础语法
shell 基础语法 =============================================== 推荐:http://c.biancheng.net/cpp/shell/ ==== ...
- 红米Note4X开发者选项
1.打开,设置->我的设备->全部参数 2.看到“MIUI版本”连点7次,在点击的过程中下部会有提示“在点X次就进入开发者模式”. 3.完成2步后,再次打开,设置->更多设置(系统和 ...
- PCI总线 DMA burst 基本概念
转载地址:http://blog.csdn.net/sunjiajiang/article/details/7945057 DMA和burst不是一个概念. DMA传送不经过CPU的控制,假如硬盘的数 ...