hdu1053 Entropy && hdu2527 Safe Or Unsafe
裸裸的哈弗曼编码,求出哈弗曼编码的路径长度,注意整个字符串为一种字符的情况
View Code
#include<iostream>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
struct node
{
int u,w;
node(int a=0,int b=0):u(a),w(b){}
bool friend operator <(const node a,const node b)//重载操作符
{
return a.w>b.w;
}
};
int f[150],n,num,d[150],root,ans;
char str[5000];
priority_queue<node> Q;
vector<int> g[500];//用向量保存每一个节点的儿子
void BTree()//建哈弗曼树
{
node p1,p2;
while(!Q.empty())
{
p1=Q.top();Q.pop();
p2=Q.top();Q.pop();
g[num].push_back(p1.u);
g[num].push_back(p2.u);
if(Q.size()==0)
break;
Q.push(node(num,p1.w+p2.w));
num++;
}
}
void DFS(int v,int deep)
{
if(g[v].size()==0)//叶子节点的深度即为编码长度
{
ans+=f[v]*deep;
return ;
}
for(int i=0;i<2;i++)
DFS(g[v][i],deep+1);
}
int main()
{
while(scanf("%s",str)==1)
{
if(strcmp(str,"END")==0)
break;
while(!Q.empty())
Q.pop();
memset(d,0,sizeof(d));
for(int i=0;i<strlen(str);i++)
d[(int)str[i]]++;
n=0;
for(int i=0;i<128;i++)
if(d[i]!=0)
{
f[n]=d[i];
Q.push(node(n++,d[i]));
}
if(Q.size()==1)
{
printf("%d %d 8.0\n",strlen(str)*8,f[0]);
continue;
}
num=n;ans=0;
BTree();
DFS(num,0);
int tt=strlen(str)*8;
printf("%d %d %.1f\n",tt,ans,tt*1.0/ans);
for(int i=0;i<=num;i++)
g[i].clear();
}
return 0;
}
hdu2527
Safe Or Unsafe
基本一样的题
View Code
#include<iostream>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
struct node
{
int u,w;
node(int a=0,int b=0):u(a),w(b){}
bool friend operator <(const node a,const node b)//重载操作符
{
return a.w>b.w;
}
};
int f[150],n,num,d[150],root,ans;
char str[5000];
priority_queue<node> Q;
vector<int> g[500];//用向量保存每一个节点的儿子
void BTree()//建哈弗曼树
{
node p1,p2;
while(!Q.empty())
{
p1=Q.top();Q.pop();
p2=Q.top();Q.pop();
g[num].push_back(p1.u);
g[num].push_back(p2.u);
if(Q.size()==0)
break;
Q.push(node(num,p1.w+p2.w));
num++;
}
}
void DFS(int v,int deep)
{
if(g[v].size()==0)//叶子节点的深度即为编码长度
{
ans+=f[v]*deep;
return ;
}
for(int i=0;i<2;i++)
DFS(g[v][i],deep+1);
}
int main()
{
int T,cmp;
scanf("%d",&T);
while(T--)
{
scanf("%d",&cmp);
scanf("%s",str);
while(!Q.empty())
Q.pop();
memset(d,0,sizeof(d));
for(int i=0;i<strlen(str);i++)
d[(int)str[i]]++;
n=0;
for(int i=0;i<128;i++)
if(d[i]!=0)
{
f[n]=d[i];
Q.push(node(n++,d[i]));
}
num=n;ans=0;
if(n==1)
{
if(strlen(str)<=cmp)
printf("yes\n");
else printf("no\n");
continue;
}
BTree();
DFS(num,0);
if(ans<=cmp)
printf("yes\n");
else printf("no\n");
for(int i=0;i<=num;i++)
g[i].clear();
}
return 0;
}
分类:
哈弗曼编码
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥