zoukankan      html  css  js  c++  java
  • HDU 1053

    求哈夫曼编码后最小内存

    就是个哈夫曼编码原理


    取最小的两个值合并在一起
    深度就是被合并了几次
    所以直接把每次合并结果加到答案里
    这样 n 次合并就表示 n 的树深,该位置的量就被累计加了 n 次, 即 子节点权值*n

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 using namespace std;
     6 char s[10000];
     7 int c[28];
     8 bool cmp(int a,int b)
     9 {
    10     return a>b;
    11 }
    12 int main()
    13 {
    14     while(~scanf("%s",s),strcmp(s,"END"))
    15     {
    16         memset(c,0,sizeof(c));
    17         int m=strlen(s);
    18         for(int i=0;i<m;i++)
    19         {
    20             if(s[i]=='_') c[0]++;
    21             else c[s[i]-'A'+1]++;
    22         }
    23         sort(c,c+27,cmp);
    24         int n=0;
    25         while(c[n]) n++;//取前面有效点集 
    26         int ans=0;
    27         for(int i=n-1;i>0;i--)
    28         {
    29             c[i-1]+=c[i]; //合并 
    30             ans+=c[i-1];
    31             sort(c,c+i,cmp);//更新点集 
    32         }
    33         if(n==1) ans=c[0];
    34         printf("%d %d %.1lf
    ",8*m,ans,8.0*m/ans);
    35     }
    36 }
    我自倾杯,君且随意
  • 相关阅读:
    jdk git maven Jenkins的配置
    jar包部署脚本
    Mybaits和Spring的那点事
    HashMap三两事
    排序算法学习
    MySQL杂谈
    一个最简单的微服务架构
    SpringBoot全家桶
    nginx上传
    使用xshell在linux服务器上部署node项目
  • 原文地址:https://www.cnblogs.com/nicetomeetu/p/5465280.html
Copyright © 2011-2022 走看看