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);
    
        }
    
    }
  • 相关阅读:
    C#中文件操作【File】和【Directory】
    MySql的不同之处
    FileStream读写文件【StreamWriter 和 StreamReader】
    将对象序列化为XML文档
    SQL自增长的数据插入
    POJ3356 AGTC (最短编辑距离问题)
    POJ3070Fibonacci(矩阵快速幂求Fibonacci数列)
    HDOJ1058 Humble Numbers
    第三届软件大赛预赛A组试题及答案
    HDOJ4526 威威猫系列故事——拼车记
  • 原文地址:https://www.cnblogs.com/watchfree/p/5307247.html
Copyright © 2011-2022 走看看