@toc
问题描述
把字符串进行压缩
一个字符原来为8bety
格式输入
s
格式输出
a b c
样例输入
AAAAABCD
样例输出
64,13,4.9
评测用例规模与约定
没有
解析
使用哈夫曼算法先统计各个字符出现的数量然后进行排序,放到树上进行计算,用优先队列实现。
过程如图所示
参考程序
#include<iostream>
#include<queue>
#include<string>
#include<vector>
#include<algorithm>
#include<stdio.h>
using namespace std;
int main()
{
string s;
double tns;
priority_queue<int, vector<int>, greater<int>>Q;
while (getline(cin, s) && s != "END") {
int t = 1;
sort(s.begin(), s.end());
tns = s.length() * 8;
for (int i = 1; i < s.length(); i++) {
if (s[i] != s[i - 1])
{
Q.push(t);
t = 1;
}
else t++;
}
Q.push(t);
int ans = 0;
while (Q.size() > 1) {
int a = Q.top(); Q.pop();
int b = Q.top(); Q.pop();
Q.push(a + b);
ans += a + b;
}
Q.pop(); cout << tns<<' '<< ans <<' '<<(double)(tns / ans);
}
}
以个人刷题整理为目的,如若侵权,请联系删除~