贪心算法 Problem D 1003 哈夫曼编码
来源:互联网 发布:股票策略编程 编辑:程序博客网 时间:2024/06/06 03:46
Problem D Problem ID:1003
简单题意:给出一组字符串,求出普通编码将占用的位数和哈夫曼编码所用的位数,以及普通编码与哈夫曼编码比率(普通编码长度除以哈夫曼编码长度)。
解题思路形成过程:哈夫曼编码所占用的位数正好等于哈夫曼树各个非根节点的权值之和。因此,将字符储存好后按每个字母的数量将其进行排序,从小到大进行遍历相加进行哈夫曼树的组建,与此同时对哈夫曼树各个非根节点的权值进行累加即可得结果。
感想:①注意题目中蕴含的数学关系,数学关系理清则很可能想出事半功倍的算法。
②注意边界条件,看边界值是否符合要求。
代码:
#include<iostream>#include<stdio.h>#include<cstring>#include<string.h>#include<algorithm>using namespace std;int a[30];char s[2000001];bool cmp(int a,int b){ return a>b;}int main(){ while(cin>>s){ if(strcmp(s,"END")==0) return 0; int num,cnt=0; memset(a,0,sizeof(a)); int len=strlen(s); for(int i=0;i<len;++i){ if(s[i]=='_') ++a[0]; else ++a[s[i]-'A'+1]; } sort(a,a+27,cmp); for(int i=0;;++i) if(a[i]==0){ num=i; break; } for(int i=num-1;i>0;--i){ a[i-1]+=a[i]; cnt+=a[i-1]; sort(a,a+num,cmp); } if(num==1)//注意边界条件! cnt=a[0]; printf("%d %d %.1f\n",8*len,cnt,8.0*len/cnt);//注意保留一位小数的写法。 }}
1 0
- 贪心算法 Problem D 1003 哈夫曼编码
- 贪心算法---哈夫曼编码
- 贪心算法-哈夫曼编码
- 哈夫曼编码--贪心算法
- 贪心算法 - 哈夫曼编码 Huffman
- 贪心算法--哈夫曼编码问题
- 贪心算法之哈夫曼编码
- 贪心算法(scheme)--哈夫曼编码
- 贪心算法 哈夫曼编码问题
- 贪心算法 - 哈夫曼编码 Huffman
- 贪心算法 - 哈夫曼编码 Huffman
- 贪心算法之哈夫曼编码
- 算法实践篇-哈夫曼编码-贪心算法
- 算法导论之贪心算法:哈夫曼编码
- 贪心算法 problem M
- 贪心算法 D题
- 贪心算法--哈夫曼编码(java实现 )
- 贪心算法实例(六):哈夫曼编码
- oop三大特性--封装性
- refreshControl
- 0xff转十进制
- 一篇不错的v4l2入门文档
- 11g dataguard 下standby database的数据文件迁移
- 贪心算法 Problem D 1003 哈夫曼编码
- 使用命名空间标准
- 捕捉崩溃日志
- 前言
- Swift是否和OC一样有runtime机制
- linux netstat 统计连接数
- Oozie编译-安装-配置
- 如何安装GoAgent
- 如何进行培养客户的成交量