zoukankan      html  css  js  c++  java
  • 试题 基础练习 Huffuman树

    一.题目

    题目链接
      http://lx.lanqiao.cn/problem.page?gpid=T69
    问题描述
      Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。
      给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:
      1. 找到{pi}中最小的两个数,设为papb,将papb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb
      2. 重复步骤1,直到{pi}中只剩下一个数。
      在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。
      本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。

      例如,对于数列{pi}={5, 3, 8, 2, 9},Huffman树的构造过程如下:
      1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5。
      2. 找到{5, 8, 9, 5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8, 9, 10},费用为10。
      3. 找到{8, 9, 10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10, 17},费用为17。
      4. 找到{10, 17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。
      5. 现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59。
    输入格式
      输入的第一行包含一个正整数nn<=100)。
      接下来是n个正整数,表示p0, p1, …, pn-1,每个数不超过1000。
    输出格式
      输出用这些数构造Huffman树的总费用。
    样例输入
    5
    5 3 8 2 9
    样例输出
    59

    二.解决

    思路:
    改动数组,使数组大小一步步变小,在这个过程中,数组存储的数据为上述的构造数据:
    对数组操作n-1次,每次操作:首先对数组排序,最小的两个数之和temp=a[0]+a[1],将temp加入数组,设置a[1]=temp,同时删除a[0](将后面的数据往前移动一位即可:for(int i=0;i<n;i++)a[i]=a[i+1])
    数组大小减一(也即n--),最后数组中只有一个数据即为所求。
    代码:
    #include<bits/stdc++.h>
    using namespace std;
    int a[110];
    int main(){
        int n,sum=0;
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>a[i];
        }
        sort(a,a+n);
        while(n>1){
            a[1]=a[0]+a[1];
            sum+=a[1];//不放在a[0]是因为下一边移数据时,a[0]会被覆盖 
            for(int i=0;i<n-1;i++){//把数组往前移一位,使a[n-1]这个位置可以删除(也即a[n-1]没有数据存储) 
                a[i]=a[i+1];
            }
            n--;//数组大小减小 
            sort(a,a+n);
        }
        cout<<sum<<endl;
    } 
     
  • 相关阅读:
    设计模式之工厂模式-抽象工厂(02)
    1036 跟奥巴马一起编程 (15 分)
    1034 有理数四则运算 (20 分)
    1033 旧键盘打字 (20 分)
    1031 查验身份证 (15 分)
    大学排名定向爬虫
    1030 完美数列 (25 分)二分
    1029 旧键盘 (20 分)
    1028 人口普查 (20 分)
    1026 程序运行时间 (15 分)四舍五入
  • 原文地址:https://www.cnblogs.com/Aiahtwo/p/12741190.html
Copyright © 2011-2022 走看看