【算法】蓝桥杯 试题 基础练习 Huffuman树
给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:
1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{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。
接下来是n个正整数,表示p0, p1, …, pn-1,每个数不超过1000。
5 3 8 2 9
#include<stdio.h>
#include<string.h>
void countSort(int n,int *p);
int Huffuman(int n,int *p); int main()
{
int n,i;
int p[];
int all;
scanf("%d",&n);
for(i=; i<n; i++)
{
scanf("%d",&p[i]);
}
all=Huffuman(n,p);
printf("%d",all);
return ;
} int Huffuman(int n,int *p)
{
int i,j;
int sum=;//记录总费用
int q=;//记录最小数的指向,当当前最小的置为0之后就移动位置
//可以控制循环次数为数组个数-1,因为每循环一次就少一个数
for (i=; i<n-; i++)
{
//1.如何找到数组中的两个最小的数?——先排序(采用计数排序)
countSort(n,p);
//2.将数组前两个相加并将最小位置为0,将第二小上面保存两个最小数的和
sum=sum+p[q]+p[q+];//记录费用
p[q+]=p[q]+p[q+];//第二小的位置上保存两个最小的相加之后的结果
p[q]=;//将最小的位置上置为0;
q++;//q指向下一位
}
return sum;
}
void countSort(int n,int *p)
{
int i;
//先找到数组中的最大元素,以便给辅助数组定空间
int max=p[];
int k=;
for(i=; i<n; i++)
{
if(p[i]>=max)
{
max=p[i];
}
}
int help[max+];//根据最大的元素来定义辅助数组的大小
//并且初始化将help数组中都为0
memset(help,,sizeof(help));
for(i=; i<n; i++)
{
//循环遍历原数组,将对应的元素传给辅助数组的下标
help[p[i]]++;
}
//扫描辅助数组,将元素不为0的下标按顺序返回给原数组
for(i=; i<max+; i++)
{
while(help[i]!=)
{
p[k]=i;
help[i]--;
k++;
}
}
}
【算法】蓝桥杯 试题 基础练习 Huffuman树的更多相关文章
- Java实现 蓝桥杯VIP 基础练习 Huffuman树
基础练习 Huffuman树 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Hu ...
- 试题 基础练习 Huffuman树
试题 基础练习 Huffuman树 试题 基础练习 Huffuman树 翻了翻网上,基本都是暴力排序.我就提供一个最小堆的写法吧! 点击这里,跳转查看最小堆插入删除函数的简单写法 Talk i ...
- 蓝桥杯试题 基础练习 2n皇后问题以及n皇后问题
在学习2n皇后之前,我们应该认识一下n皇后问题: 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于 ...
- 蓝桥杯基础练习 Huffuman树
基础练习 Huffuman树 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Hu ...
- 基础练习 Huffuman树
基础练习 Huffuman树 时间限制:1.0s 内存限制:512.0MB 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给 ...
- Java实现 蓝桥杯VIP 基础练习 高精度加法
java算法 蓝桥杯 高精度加法 问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数 ...
- java算法 蓝桥杯 乘法运算
问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...
- java算法 蓝桥杯 扶老奶奶街
一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶是被我和D其中 ...
- java算法 蓝桥杯 高精度加法
问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...
随机推荐
- selenium,滚到页面底部的方法
你可以用 execute_script方法来处理这个. 调用原生javascript的API,这样你想滚到哪里就能滚到哪里. 下面的代码演示了如何滚到页面的最下面: driver.execut ...
- Selenium(一):元素定位
一.Selenium 8种定位方式 baidu.html <form id="form" name="f" action="/s" c ...
- vsphere部署说明
前言 简单介绍一下vsphere及相关组件: vsphere是VMware公司推出一款虚拟化产品,ESXi与Vcenter是其组成部分:ESXi将物理基础设施虚拟化成虚拟池,Vcenter将ESXi虚 ...
- Ceph 存储集群-低级运维
低级集群运维包括启动.停止.重启集群内的某个具体守护进程:更改某守护进程或子系统配置:增加或拆除守护进程.低级运维还经常遇到扩展.缩减 Ceph 集群,以及更换老旧.或损坏的硬件. 一.增加/删除 O ...
- 计算机原理基础:DNS
DNS服务的作用 将域名解析成IP地址 端口号:53 域名服务器 根域名服务器 所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址. 不管是哪一个本地域名服务器,若要对因特网上任何一个域名进 ...
- 【2020-02-11】1346. Check If N and Its Double Exist
更多LeetCode解题详解 Easy Given an array arr of integers, check if there exists two integers N and M such ...
- conCat()的应用
编写一个Java应用程序,从键盘读取用户输入两个字符串,并重载3个函数分别实现这两个字符串的拼接.整数相加和浮点数相加.要进行异常处理,对输入的不符合要求的字符串提示给用户: package com. ...
- Android Webview实现有道电子词典
毕业设计android电子词典,先实现的一个小小的demo. 所谓的毕业设计就是用最短的时间学习一门语言,做出一个小的project. activity_main.xml <LinearLayo ...
- 《Android Studio实战 快速、高效地构建Android应用》--二、在Android Studio中编程
代码折叠 Ctrl+数字加号展开光标处已折叠代码块 Ctrl+数字减号折叠光标处已展开代码块 Ctrl+Shift+数字加号展开窗口中全部代码 Ctrl+Shift+数字减号折叠窗口中全部代码 注释代 ...
- 90万条数据玩转RFM用户分析模型
RFM,是一种经典的用户分类.价值分析模型: R,Rencency,即每个客户有多少天没回购了,可以理解为最近一次购买到现在隔了多少天. F,Frequency,是每个客户购买了多少次. M,Mone ...