蓝桥杯 BASIC-28 VIP试题 Huffuman树

举报
2002 发表于 2022/02/24 15:25:15 2022/02/24
【摘要】 试题 基础练习 Huffuman树提交此题   评测记录  资源限制时间限制:1.0s   内存限制:512.0MB问题描述  Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。  给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:  1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删...

试题 基础练习 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


解题思路如下---

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(); // 定义n来接收数组的长度
        int[] arr = new int[n]; // 定义一个n个单位长度的数组
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt(); // 输入数据
        }
        int count = 0; // 循环次数
        int tmp = arr.length - 1;// 循环的总次数
        int money = 0; // 总和
        int max = 0; // 占位符
        for (int i = 1; i < n; i++) {
            max += arr[i];// 从下标为1的开始加 占位
        }
        while (arr.length != count + 1) {// 总和的个数为数组长度少1时
            Arrays.sort(arr);// 排序
            money = arr[0] + arr[1] + money;// 最小两数的和依次相加的和
            arr[0] = arr[0] + arr[1];// 最小两位的和覆盖第0位 相当于删除第一小的

            for (int i = 1; i < tmp; i++) {
                arr[i] = arr[i + 1];// 向前移一位,第0位和最后一位不变 相当于删除第二小的
            }
            arr[arr.length - count - 1] = max;// 由最后一位依次向前填
            count++;// 循环的次数
        }
        System.out.println(money);
    }
}

演示效果如下---
希望本篇文章能够帮助大家!
谢谢大家!
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。