蓝桥杯java 基础练习 Huffuman树

问题描述

  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.Scanner;

import java.util.PriorityQueue;

public class Main {
	static PriorityQueue<Integer> q;

	public static void main(String[] args) {
		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);

	}

}

  

原文地址:https://www.cnblogs.com/duanyingkui/p/8338203.html

时间: 2024-11-13 09:38:00

蓝桥杯java 基础练习 Huffuman树的相关文章

蓝桥杯java 基础练习 龟兔赛跑预测

问题描述 话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点--喜欢赛跑.于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑.他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病--骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以上,它们就会停下来休息s秒.对于不同的兔子,t,s的数值是不同的,但是所有的乌龟却是一致--它们不到终点决不停止. 然而有些比赛相当漫长,全程观看会耗费大量时间

【蓝桥杯】校门外的树

原文地址:http://leihuang.net/2014/05/19/List-Interviews/ 单链表的一些常见面试题汇总 单链表反转/逆序 求单链表倒数第N个数 找到单链表的中间结点 如何判断链表是否有环的存在 单链表建环,无环链表变有环 如何知道环的长度? 如何找出环的连接点在哪里? 删除单链表中的重复元素 下面我先简单叙述一下每道题的思路,然后把实现的程序一起贴出来,不会讲得太细,我觉得只要有了思路之后,接下来的难点就是语言上的一些细节问题了,这个不自己去实现,听别人讲是体会不到

蓝桥杯:基础练习 十进制转十六进制【JAVA算法实现】

题目描述 给出一个非负整数,将它表示成十六进制的形式. 输入格式 输入包含一个非负整数a,表示要转换的数.0<=a<=2147483647 输出格式 输出这个整数的16进制表示 实数输出的问题如果没有特别说明,舍入都是按四舍五入进行. 样例输入 30 样例输出 1E import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(Sy

蓝桥杯:基础练习 01字串【JAVA算法实现】

题目描述 对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能.它们的前几个是: 00000 00001 00010 00011 00100 请按从小到大的顺序输出这32种01串. 输入格式 本试题没有输入. 输出格式 输出32行,按从小到大的顺序每行一个长度为5的01串. 样例输出 00000 00001 00010 00011 00100 <以下部分省略> public class Main { public static void main(String[] args) {

蓝桥杯:基础练习 字母图形【JAVA算法实现】

题目描述 利用字母可以组成一些美丽的图形,下面给出了一个例子: ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC 这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形. 输入格式 输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数. 输出格式 输出n行,每个m个字符,为你的图形. 样例输入 5 7 样例输出 ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC 数据规模与约定 1 <= n, m <= 26

蓝桥杯:基础练习 杨辉三角形【JAVA算法实现】

题目描述 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数. 它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加. 下面给出了杨辉三角形的前4行: 1 1 1 1 2 1 1 3 3 1 给出n,输出它的前n行. 输入格式 输入包含一个数n. 输出格式 输出杨辉三角形的前n行.每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔.请不要在前面输出多余的空格. 样例输入 4 样例输出 1 1 1 1 2 1 1 3 3 1 public class Ma

第五届蓝桥杯Java组大学校园选拔真题_n级台阶

/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: 蓝桥杯赛题 * 作    者:   彭俊豪 * 完成日期:   2016   年 04月 01日 * 版 本 号:      001 * 对任务及求解方法的描述部分 * 问题描述: 有n级台阶.从地面(第0级)出发,首先连续的上台阶,上到不超过第n级的某一个位置后再连续的下台阶,直到回到地面.若每次

2015年蓝桥杯java b组第十题

10. 生命之树 在X森林里,上帝创建了生命之树. 他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值. 上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都存在一个点列 {a, v1, v2, -, vk, b} 使得这个点列中的每个点都是S里面的元素,且序列中相邻两个点间有一条边相连. 在这个前提下,上帝要使得S中的点所对应的整数的和尽量大. 这个最大的和就是上帝给生命之树的评分. 经过atm的努力,他已经知道了上帝给每棵树上每个节点上的整数

蓝桥杯 大臣的旅费_树的最长度_两次DFS

#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #include <functional> #include <vector> using namespace std; const int maxn = 1000000 + 10; const int INF = 10000000