题目链接:poj
题目大意:赤裸裸的huffman编码,就是压缩编码,给一个串求出最短的编码
题目分析:最近学HUFFMAN编码,所以拿来用下,原理不再细讲
题目总结:1.priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:
priority_queue<Type, Container,Functional>
其中Type 为数据类型, Container 为保存数据的容器,Functional为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用list.
STL里面默认用的是 vector. 比较方式默认用 operator< ,所以如果你把后面俩个参数缺省的话,
优先队列就是大顶堆,队头元素最大。
e.g.-》priority_queue<int,vector<int>,greater<int>>Q;
greater<int>(最小顶堆) less<int>(最大顶堆);
详细资料:点击打开链接
2.huffman资料:点击打开链接
3.getline(cin,str)//系统默认“\n”结束,你也可以自己定义getline (cin,str,'#');
istream& getline ( istream &is , string &str , char delim );
比较函数:
#include<queue>
struct node
{
int x, i;
}a[maxn];
struct cmp
{
bool operator() (const node a, const node b) {
if(a.x == b.x) return a.i < b.i;
return a.x > b.x;
}
};
priority_queue<node, vector<node>, cmp> q;//自己写的比较函数
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<algorithm>
#include<queue>
priority_queue<int,vector<int>,greater<int> > que;//最小顶堆
using namespace std;
int main()
{
string str;
int level,a,b;
while(1)
{
getline(cin,str);
if(str=="END")
break;
sort(str.begin(),str.end());
char ch=str[0];int count=1;
for(int i=1;i<str.length();i++)
{
if(ch==str[i]) count++;
else
{ ch=str[i];
que.push(count);count=1;
}
}
level=0;
que.push(count);
if(que.size()==1) level=que.top();
while(1)
{
a=que.top();
que.pop();
if(que.empty())break;
b=que.top();
que.pop();
level+=a+b;
que.push(a+b);
}
printf("%d %d %.1f\n",str.length()*8,level,(double)str.length()*8/level);
}
return 0;
}