贪心算法 problemD
2016-04-07 10:10
323 查看
简单题意:给出一组字符串,求出普通编码将占用的位数和哈夫曼编码所用的位数,以及普通编码与哈夫曼编码比率(普通编码长度除以哈夫曼编码长度)。
解题思路形成过程:哈夫曼编码所占用的位数正好等于哈夫曼树各个非根节点的权值之和。因此,将字符储存好后按每个字母的数量将其进行排序,从小到大进行遍历相加进行哈夫曼树的组建,与此同时对哈夫曼树各个非根节点的权值进行累加即可得结果。
#include <iostream>#include <cstring>
#include <stdio.h>
using namespace std;
struct{
int w;
int p;
int l;
int r;
}ASC[60];
int main()
{
char ch[100000];
int hash[35];
int i,j,k;
int lenght;
while(cin>>ch,strcmp(ch,"END")!=0)
{
memset(hash,0,sizeof(hash));
lenght=strlen(ch);
for(i=0;i<lenght;i++)
{
hash[ch[i]-64]++;
}
for(i=1,j=1;i<35;i++)
{
if(hash[i]!=0)
{
ASC[j].w=hash[i];
ASC[j].p=ASC[j].l=ASC[j].r=0;
j++;
}
}
j--;
for(i=j+1;i<j*2;i++)
ASC[i].p=ASC[i].l=ASC[i].r=0;
for(i=j+1;i<j*2;i++)
{
int m1,m2;
m1=m2=999999;
int x1,x2;
for(k=1;k<i;k++)
{
if(ASC[k].w<m1&&ASC[k].p==0)
{
m2=m1;
x2=x1;
m1=ASC[k].w;
x1=k;
}
else if(ASC[k].w<m2&&ASC[k].p==0)
{
m2=ASC[k].w;
x2=k;
}
}
ASC[i].w=m1+m2;
ASC[i].r=x1;
ASC[i].l=x2;
ASC[x1].p=i;
ASC[x2].p=i;
}
int sum=0;
int cnt;
for(i=1;i<j+1;i++)
{
k=i;
cnt=0;
while(ASC[k].p!=0)
{
k=ASC[k].p;
cnt++;
}
sum+=cnt*ASC[i].w;
}
if(j==1)
sum=lenght;
float ratio;
ratio=float(lenght*8)/sum;
printf("%d %d %.1f\n",lenght*8,sum,ratio);
}
return 0;
}
相关文章推荐
- ajaxFileUpload返回的json数据带<pre>标签,导致无法执行success后面的代码
- Android 开发最佳实践
- Spark 临时记录
- android软键盘弹出引起的各种不适终极解决方案
- 交叉编译arm gdb
- simcom7100c在ubuntu下移动宽带mobile broadband上网
- C++作业2
- linux修改硬盘已挂载目录
- Android学习笔记函数
- Tomcat与jdk在Linux上的安装与配置
- syntaxhighlighter的使用
- Adobe Acrobat X Pro 10.1.0关闭自动更新的方法
- Counting Bits
- C++之类的比较运算符的重载
- activiti自定义流程之Spring整合activiti-modeler5.16实例(七):任务列表展示
- MYSQL中取当前周/月/季/年的第一天与最后一天
- UIViewContentMode各类型效果
- activiti自定义流程之Spring整合activiti-modeler5.16实例(七):任务列表展示
- Notepad++ 主观感受
- 关于C++泛型编程,模板声明和定义最好在同一个文件的解释。