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. OC与Swift的区别五(函数)

    13 函数 oc函数定义: 返回值类型 函数名(参数类型 参数名,参数类型 参数名){ } swift 函数定义: func 函数名(参数名:参数类型,参数名:参数类型) -> 返回值类型{ } ...

  2. [转]:移动端H5页面高清多屏适配方案

    原文链接:http://www.tuicool.com/articles/YJviea 背景 开发移动端H5页面 面对不同分辨率的手机 面对不同屏幕尺寸的手机 视觉稿 在前端开发之前,视觉MM会给我们 ...

  3. UVA 11732 strcmp() Anyone?(Trie的性质)

    strcmp() Anyone? strcmp() is a library function in C/C++ which compares two strings. It takes two st ...

  4. Python没有执行__init__

    疑惑 提出问题 前天同事问我一个问题,为什么这个脚本中的没有调用A 的__init__.脚本如下: class A(object): def __init__(self, *args, **kwarg ...

  5. apache常用工作模式的区别

    apache常用工作模式有两种 worker模式1.线程模式2.占用资源少3.稳定性略差4.并发大 prefork模式1.进程模式2.占用资源多3.稳定4.并发一般  来自为知笔记(Wiz)

  6. mysql主从 1050错误

    在mysql从库上查询时出现如下错误 ...................... Last_Errno: 1050                    Last_Error: Error 'Tab ...

  7. SQLServer:定时作业

    SQLServer:定时作业: 如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200字符以内的SQL语句时,可以用管理-SQL Server代理-作业来实现 也快可以定时备 ...

  8. JavaScript原型链demo

    function Person(name){ this.name = name; } Person.prototype = { say: function(){ alert('hi'); }, say ...

  9. Linux grep和find的区别

    这是两个不同的命令,关于grep:Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expressi ...

  10. php获取文件mime类型Fileinfo等方法

    前几天写到使用wordpress xmlrpc api远程发布文章,如果本地服务器的文章库里某一篇待发表的wordpress文章包含图片文件时,就会使用到WordPress上传文件的API metaW ...