哈夫曼树 优先队列STL的应用
来源:互联网 发布:淘宝服务商窦娥 编辑:程序博客网 时间:2024/06/14 05:27
最近每次做题都要看很多资料。看来是真的老了。
这题给定字符串,以及待编码的字符数,采用哈夫曼编码,编码总长度最短。求此值。
这题添加虚拟节点,使得最后的合并方便,也就是使得每次合并保证树中都大于T个。T为提供的编码字符数。
相当于每一个节点要么是空的要么是有T个孩子的。
设待编码字符为N,添加的虚节点个数为β。
那么对(N+β)进行一次合并-> (N+β)-T+1 第二次合并 (N+β)-2*(T-1)
......
最后一次(N+β)-r*(T-1)=1
也就是(N+β)%(T-1)==1%(T-1); 好像出现了同余...
下面代码基本上是段学妹的.. 我待会儿看看STL的一些个东西...
PS:据说priority_queue内部是用红黑树实现的,跪了....
#include<iostream>#include<cstdio>#include<queue>#include<algorithm>#include<map>using namespace std;bool cmp( int a,int b ){ return a<b;}int main(){ freopen( "K.in","r",stdin ); freopen( "ans.out","w",stdout ); char str[111111];int n; map<char,int> mp; map<char,int>::iterator it; priority_queue< int,vector<int>,greater<int> >que; while( gets(str) ) { scanf( "%d",&n ); getchar(); mp.clear(); for( int i=0;i<strlen(str);i++ ) mp[str[i]]++; while( !que.empty() ) que.pop(); for( it=mp.begin();it!=mp.end();it++ ) que.push((*it).second); while( que.size()%(n-1)!=1%(n-1)) que.push(0); int ans=0; if( mp.size()<=n ) ans = strlen(str); else { while( que.size()!=1 ) { int su=0; for( int i=0;i<n;i++ ) { su+=que.top(); que.pop(); } ans+=su; que.push(su); } } printf( "%d\n",ans ); } return 0;}
- 哈夫曼树 优先队列STL的应用
- STL 优先队列的 优先级
- STL 优先队列的优先级
- STL 优先队列的优先级
- STL优先队列的使用方法
- STL 的神器,优先队列
- STL的神器,优先队列
- STL 优先队列的 优先级
- STL优先队列的优先级
- STL 优先队列的优先级
- 优先队列的应用
- 优先队列的应用
- 优先队列的应用
- 优先队列stl在竞赛中的应用
- 队列的应用:优先队列
- 哈夫曼树 --- 优先队列(C++STL)
- STL 优先队列、队列、栈的使用
- STL 优先队列、队列、栈的用法
- stm32f103开发板 PCB
- 区间最值线段树
- cocos2d-x学习笔记(16)--spritesheet(精灵表单)
- c语言简单的调试1
- DFS+数学:Digital Square
- 哈夫曼树 优先队列STL的应用
- Linux 中的零拷贝技术,第 2 部分
- Linux 中的零拷贝技术,第 1 部分
- Java线程的创建和启动
- linux--线程
- 搭建Erlang语言开发环境(文本编辑器+Erlang OTP,不是绑定IDE的环境)
- 局域网连接mysql
- JQuery操作 text,select,textarea,radio,checkbox
- 2012年电脑的声音知识学习