【哈夫曼编码】HDU2527-Safe Or Unsafe

Safe Or Unsafe
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1474    Accepted Submission(s): 582

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
HDU 2008-10 Programming Contest

 

 

 

 

题意:建完树后,判断下除了叶子结点之外的其他结点之和是否大于题目给出的数字。

建立哈夫曼树的过程就是在集合中找出两个最小值,两者之和成一个新值,加入原来的集合中。。。。

优先队列模拟建哈夫曼树。。。。
AC代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
char a[1500];
int flag[27];
int main()
{
    int i,j,n,m,k,x,y,sum;
    scanf("%d",&n);
    while(n--)
    {
       scanf("%d",&m);
       memset(a,0,sizeof(a));
       scanf("%s",&a);
       k=strlen(a);
       memset(flag,0,sizeof(flag));
       for(i=0;i<k;i++)
       {
          flag[a[i]-'a']++;
       }

       priority_queue<int,vector<int>,greater<int> > q;
       for(i=0;i<26;i++)
       {
          if(flag[i]!=0)
          q.push(flag[i]);
       }
       sum=0;
       if(q.size()==1)
       {
          if(k>m)
          printf("no\n");
          else
          printf("yes\n");
       }
       else
       {
           while(q.size()>1)
           {
              x=q.top();q.pop();
              y=q.top();q.pop();
              sum+=(x+y);
              q.push(x+y);
           }

           if(sum<=m)
           printf("yes\n");
           else
           printf("no\n");
       }
    }
    return 0;
}

这里我打印出了样例建立哈夫曼树的过程:
3
12
helloworld
x=1 y=1 sum=2
x=1 y=1 sum=2
x=1 y=2 sum=3
x=2 y=2 sum=4
x=3 y=3 sum=6
x=4 y=6 sum=10
sum=27
no
66
ithinkyoucandoit
x=1 y=1 sum=2
x=1 y=1 sum=2
x=1 y=1 sum=2
x=1 y=2 sum=3
x=2 y=2 sum=4
x=2 y=2 sum=4
x=2 y=3 sum=5
x=3 y=4 sum=7
x=4 y=5 sum=9
x=7 y=9 sum=16
sum=54
yes

时间: 2024-09-15 21:12:53

【哈夫曼编码】HDU2527-Safe Or Unsafe的相关文章

哈夫曼(huffman)树和哈夫曼编码

哈夫曼树 哈夫曼树也叫最优二叉树(哈夫曼树)    问题:什么是哈夫曼树? 例:将学生的百分制成绩转换为五分制成绩:≥90 分: A,80-89分: B,70-79分: C,60-69分: D,<60分: E. if (a < 60){ b = 'E'; } else if (a < 70) { b = 'D'; } else if (a<80) { b = 'C'; } else if (a<90){ b = 'B'; } else { b = 'A'; } 判别树:用于描

关于哈夫曼编码的程序运行时出错,我分析是由于cd定义出现了问题,导致后边cd[--start]出错

问题描述 关于哈夫曼编码的程序运行时出错,我分析是由于cd定义出现了问题,导致后边cd[--start]出错 void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n){ //w存放n个字符的权值(均>0),构造赫夫曼树 HT,并求出n个字符的赫夫曼编码 HC printf("123"); system("pause"); int s1,s2,i,start; int f=0

简单快速的哈夫曼编码

介绍 本文描述在网上能够找到的最简单,最快速的哈夫曼编码.本方 法不使用任何扩展动态库,比如STL或者组件.只使用简单的C函数,比如: memset,memmove,qsort,malloc,realloc和memcpy. 因此,大家都会发现 ,理解甚至修改这个编码都是很容易的. 背景 哈夫曼压缩是个无损的压缩算法,一般用来压缩文本和程序文件.哈夫 曼压缩属于可变代码长度算法一族.意思是个体符号(例如,文本文件中的字符 )用一个特定长度的位序列替代.因此,在文件中出现频率高的符号,使用短的 位序

哈夫曼编码长度问题,证明题

问题描述 哈夫曼编码长度问题,证明题 已知字符串中某一字符出现的频率大于0.4,证明该字符串中存在某一字符的哈夫曼编码长度为1;如果字符串中所有字符出现的频率都小于三分之一,证明字符串中不存在哈夫曼编码长度为1的字符 解决方案 http://www.zybang.com/question/041154e0c4adf3af1f0dfac8629a346f.html

c-跪求大神 帮忙,这段关于哈夫曼编码 的程序着实看不懂啊。。。。。。。

问题描述 跪求大神 帮忙,这段关于哈夫曼编码 的程序着实看不懂啊....... struct Codetype{//哈弗曼编码数据类型 char bits;//编码流-数组,n为为哈夫曼树中叶子结点的数目,编码的长度不可能超过n int start;//编码实际在编码流数组里的开始位置 }; Codetype *HuffmanCode(hufmtree *tree){//哈弗曼编码的生成 int i,j,p,k; Codetype *code; if(tree==NULL) return NUL

【哈夫曼编码】HDU1053-Entropy

Entropy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4178    Accepted Submission(s): 1707 Problem Description An entropy encoder is a data encoding method that achieves lossless data compres

【Matlab编程】哈夫曼编码的Matlab实现

       在前年暑假的时候,用C实现了哈夫曼编译码的功能,见文章<哈夫曼树及编译码>.不过在通信仿真中,经常要使用到Matlab编程,所以为了方便起见,这里用Matlab实现的哈夫曼编码的功能.至于哈夫曼编译码的基本原理,我们可以参考之前的文章<哈夫曼树及编译码>,里面有详细的说明及图解过程.下面直接给出具体的Matlab实现的哈夫曼编码函数,由于程序中注释还算比较详细,在此就不予与说明: function [ h,e ] = Huffman_code( p ) %p为概率分布

电工4课程作业2:哈夫曼编码实验

问题描述 电工4课程作业2:哈夫曼编码实验 1) 问题描述设某编码系统共有n个字符,使用频率分别为{w1, w2, -, wn},设计一个不等长的编码方案,使得该编码系统的空间效率最好.2) 基本要求(1) 设计数据结构:(2) 设计编码算法:(3) 分析时间复杂度和空间复杂度. 解决方案 http://blog.csdn.net/fduan/article/details/7837444http://blog.sina.com.cn/s/blog_686d0fb001012qmh.html 解

范式霍夫曼编码 码长不连续 产生不能识别部分编码

问题描述 范式霍夫曼编码 码长不连续 产生不能识别部分编码 如图 范式霍夫曼编码 遇到这种 编码长度不连续的情况 网上说 extern KBitInputStream bs; int len = 1; int code = bs.ReadBit(); while(code >= first[len]) { code <<= 1; code |= (bs.ReadBit()); // append next input bit to code len++; } len--; // 至此,识