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

     基础练习 Huffuman树  
    时间限制:1.0s   内存限制:512.0MB
          
    问题描述
      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
     
    --------------------------
    给出两种方法
    一个用
     ArrayList<String>

    另一个用优先队列

    ------------------
    import java.util.ArrayList;
    import java.util.Scanner;
    import java.util.Collections;
    public class Main
    {
    private static ArrayList<Integer> list=new ArrayList<Integer>();
    public static void main(String args[])
    {
    Scanner sc=new Scanner(System.in);
    int n=sc.nextInt();
    int sum=0;
    for(int i=0;i<n;i++)
    {
    list.add(sc.nextInt());
    }
    
    for(int j=1;j<n;j++)
    {
    f(list);
    sum=sum+list.get(list.size()-1);
    
    }
    
    System.out.println(sum);
    }
    
    public static ArrayList<Integer> f(ArrayList<Integer> list)
    {
    Collections.sort(list);
    int sum=list.get(0)+list.get(1);
    list.remove(list.get(0));
    list.remove(list.get(0));
    list.add(sum);
    return list;
    
    }
    
    }

    ---------------

    使用优先队列

    ----------------

    import java.util.PriorityQueue;
    import java.util.Scanner;
    public class Main {
        static PriorityQueue<Integer> q;
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Scanner sc =new Scanner(System.in);
            q=new PriorityQueue<Integer>();
            int n=sc.nextInt();
            for(int i=0;i<n;i++){
                q.offer(sc.nextInt());
            }
            int ans=0; int tmp1,tmp2;int ans1=0;
            while(!q.isEmpty() && q.size()>=2){
                ans=0;
                tmp1=q.poll();
                tmp2=q.poll();
                ans=tmp1+tmp2;
                q.offer(ans);
                ans1+=ans;
                
            }
            System.out.println(ans1);
    
        }
    
    }
  • 相关阅读:
    使用Acctinfo.dll了解更多AD用户帐号信息
    vue elementUI之Form表单 验证
    vue element-ui 表格筛选,点击筛选数据
    使用Bootstrap + Vue.js实现 添加删除数据
    CSS3过渡效果 兼容IE6、IE7、IE8
    使用Ajax、json实现京东购物车结算界面的数据交互
    JavaScript面向对象,闭包内存图,闭包和作用域
    实现一个宽和高都是100像素的div可以用鼠标拖拽移动的效果
    JavaScript鼠标事件,点击鼠标右键,弹出div
    javascript sort排序
  • 原文地址:https://www.cnblogs.com/watchfree/p/5307247.html
Copyright © 2011-2022 走看看