http://acm.hdu.edu.cn/showproblem.php?pid=2527

建哈夫曼树,哈夫曼编码,求wpl值。

Safe Or Unsafe

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

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<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct node
{
char ch;//节点值
int weight;//权重
int parent;//双亲节点
int lchild,rchild;//孩子节点
}ht[];
struct Hcode
{
char cd[];//存入01编码的字符串。
int start;//长度的开始。
}hcd[];
void creat(node ht[],char *c,int *w,int n)//建哈夫曼树。
{
int i,s1,s2,k,min1,min2;
for(i=;i<=n;i++)//初始化叶子节点
{
ht[i].ch=c[i-];//字符。
ht[i].weight=w[i-];//权值
ht[i].parent=ht[i].lchild=ht[i].rchild=;//开始为0.
}
for(;i<*n;i++)//树的节点一共为2*n-1个。
{
ht[i].parent=;
ht[i].lchild=;
ht[i].rchild=;
}
for(i=n+;i<*n;i++)
{
min1 = min2 = ;
for(k=;k<=i-;k++)//求权值最小的2个权值。
if(ht[k].parent == )
{
if(ht[k].weight<min1)
{
min2 = min1;
s2= s1;
min1= ht[k].weight;
s1= k;
}
else if(ht[k].weight<min2)
{
min2 = ht[k].weight;
s2 = k;
}
} ht[s1].parent=i;//建立节点。
ht[s2].parent=i;
ht[i].lchild=s1;
ht[i].rchild=s2;
ht[i].weight=ht[s1].weight+ht[s2].weight; } }
void creatHcode(node 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 T,m,i,r,j;
int w[];
char str[],c[];
scanf("%d",&T);
while(T--)
{
memset(w,,sizeof(w));
scanf("%d",&m);
getchar();
scanf("%s",str);
int len=strlen(str);
r=;
c[r++]=str[];
w[]=;
for(i=;i<len;i++)
{
for(j=;j<r;j++)
{
if(c[j]==str[i])
{
w[j]=w[j]+;
break;
}
}
if(j==r)
{ w[r]=;
c[r++]=str[i];
}
}
c[r]='\0';
if(r==)
{
if(w[]<=m)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
continue;
}
creat(ht,c,w,r);
creatHcode(ht,hcd,r);
int wpl=;
for(i=;i<=r;i++)
{
wpl+=(r-hcd[i].start+)*ht[i].weight; }
if(wpl<=m)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return ;
}
 

HDU-2527 Safe Or Unsafe的更多相关文章

  1. hdu 2527:Safe Or Unsafe(数据结构,哈夫曼树,求WPL)

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

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

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

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

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

  4. 随手练——HDU Safe Or Unsafe (小根堆解决哈夫曼问题)

    HDU 2527 :http://acm.hdu.edu.cn/showproblem.php?pid=2527 哈夫曼树,学完就忘得差不多了,题目的意思都没看懂,有时间复习下,看了别人的才知道是怎么 ...

  5. HDU 2527

    题目描述          HDU 2527 分析         霍夫曼编码的应用.         本题没有必要构造一棵完整的霍夫曼树.只需利用霍夫曼编码的原理,每次挑选频率最低的两个元素进行合并 ...

  6. Safe Or Unsafe(hdu2527)哈弗曼VS优先队列

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

  7. HDU 1053 & HDU 2527 哈夫曼编码

    http://acm.hdu.edu.cn/showproblem.php?pid=1053 #include <iostream> #include <cstdio> #in ...

  8. HDU 3350 #define is unsafe

    题目大意:给定一个只含有MAX和+操作的式子,求加法运行了多少次,其中MAX使用宏定义. 题解:注意一个规律,对于MAX(A,B)其中A中加a次,B中加b次若A>B,则加a*2+b次,否则a+b ...

  9. HDU2527:Safe Or Unsafe(哈弗曼树)

    Problem Description Javac++ 一天在看计算机的书籍的时候,看到了一个有趣的东西!每一串字符都可以被编码成一些数字来储存信息,但是不同的编码方式得到的储存空间是不一样的!并且当 ...

随机推荐

  1. 销毁session

    session运行在服务器是单用户,每个session都有一个唯一的sessionid 用法:session.setAttribute("userName", "张三丰& ...

  2. stack around the variable “XX” was corrupted

    晚上花了几个小时fix了这个恼人的BUG!“在变量XX周围的堆栈已损坏” 在网上找到的解释是: 把“project->配置属性->c/c++->代码生成->基本运行时检查 设置 ...

  3. Java Lambda简明教程(一)

    Lambda表达式背景 许多热门的编程语言如今都有一个叫做lambda或者闭包的语言特性,包括比较经典的函数式编程语言Lisp,Scheme,也有稍微年轻的语言比如JavaScript,Python, ...

  4. 设计模式之 Factory Method 工厂方法

    看到的比较有意思的一篇描述工厂方法的文章. http://www.codeproject.com/Articles/492900/From-No-Factory-to-Factory-Method 总 ...

  5. 四层运维工具nc

        nc命令全名为netcat,顾名思义就是通过TCP或UDP从网络读写数据. 很多事情不一定非得抓包,nc也能发挥巨大作用. 1.传输文件 使用<>重定向符(只适用单文件,不推荐.失 ...

  6. nginx 显示discuz页面

    我也不知道我题目表述的对不对.我也是刚学习. 安装nginx 显示discuz的界面.我看了好几次视频,也没发现哪的问题.就是一直出现502的错误代码 我又重新查了几次.觉得需要注意一下几点: 1,关 ...

  7. php PHP_EOL 常量

    换行符 unix系列用 \n windows系列用 \r\n mac用 \r PHP中可以用PHP_EOL来替代,以提高代码的源代码级可移植性 <?php echo PHP_EOL; //win ...

  8. C# Linq To DataTable 分组统计 DEMO

    DataTable dt = SQLLayer.Get工作量统计(beginDate, endDate);             var querySum = from t in dt.AsEnum ...

  9. 支付宝开发(一)-认识php openssl RSA 非对称加密实现

    获取支付宝公钥 本地服务器生成私钥和公钥 运用php中openssl相关函数加密解密验证身份 以下是php中openssl相关函数实现的验证,来自php官方demo //需要签名的数据 $data = ...

  10. 商务通简单弹窗样式 V1.0

    代码为: document.writeln('<style>*{margin:0; padding:0;}</style>');//创建中间弹框    document.wri ...