笔记---贪心---哈夫曼Huffman树

AcWing.148.合并果子

在一个果园里,达达已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。

达达决定把所有的果子合成一堆。

每一次合并,达达可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。

可以看出,所有的果子经过 n − 1 n−1 n1 次合并之后,就只剩下一堆了。

达达在合并果子时总共消耗的体力等于每次合并所耗体力之和。

因为还要花大力气把这些果子搬回家,所以达达在合并果子时要尽可能地节省体力。

假定每个果子重量都为 1 1 1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使达达耗费的体力最少,并输出这个最小的体力耗费值。

例如有 3 3 3 种果子,数目依次为 1 , 2 , 9 。 1,2,9。 129

可以先将 1 、 2 1、2 12 堆合并,新堆数目为 3 3 3,耗费体力为 3 3 3

接着,将新堆与原先的第三堆合并,又得到新的堆,数目为 12 12 12,耗费体力为 12 12 12

所以达达总共耗费体力 = 3 + 12 = 15 。 =3+12=15。 =3+12=15

可以证明 15 15 15 为最小的体力耗费值。

输入格式
输入包括两行,第一行是一个整数 n n n,表示果子的种类数。

第二行包含 n n n 个整数,用空格分隔,第 i i i 个整数 a i a_{i} ai 是第 i i i 种果子的数目。

输出格式
输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。
输入数据保证这个值小于 2 31 2^{31} 231

数据范围
1 ≤ n ≤ 10000 , 1≤n≤10000, 1n10000,
1 ≤ a i ≤ 20000 1≤a_{i}≤20000 1ai20000

输入样例:

3 
1 2 9 

输出样例:

15

哈夫曼树:

一个二叉树,从中确定叶节点来使得总代价最小
按照贪心的思路,每次确定最小的两个点来合并

1.值最小的两个点,在树中的深度一定是最深的,且可以互为兄弟
2.同一个贪心策略,n个节点的树的贪心最优解一定是n-1个节点的树的贪心最优解

证明过程:AcWing算法基础课贪心(一)01:39:00

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;int main() {int n; cin >> n;//用小根堆模拟树priority_queue< int, vector<int>, greater<int> >heap;while (n--) {		//读入int x; cin >> x;heap.push(x);	//插入堆}int res = 0;		//答案while (heap.size() > 1) {	//如果堆中元素个数大于1就合并int a = heap.top();		//拿出堆中的最小值heap.pop();int b = heap.top();heap.pop();res += (a + b);			//让答案加上两堆果子的重量heap.push(a+b);			//插入堆}cout << res;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/670462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Parse Error: Invalid header token 的可能性及解决情况

项目场景&#xff1a; 背景&#xff1a; 使用接口测试工具时&#xff0c;请求失败&#xff0c;出现以下错误信息&#xff1a; Parse Error: Invalid header token 问题描述 问题&#xff1a; 使用接口测试工具时&#xff0c;请求失败&#xff0c;出现以下错误信息&#xff…

Oracle Vagrant Box 扩展根文件系统

需求 默认的Oracle Database 19c Vagrant Box的磁盘为34GB。 最近在做数据库升级实验&#xff0c;加之导入AWR dump数据&#xff0c;导致空间不够。 因此需要对磁盘进行扩容。 扩容方法1&#xff1a;预先扩容 此方法参考文档Vagrant, how to specify the disk size?。 指…

Linux Shell编程系列--变量的定义与使用

一、目的 上一篇我们简单介绍了shell脚本的组成以及如何运行一个shell脚本&#xff0c;本篇将详解讲解shell中的变量。在Shell脚本中&#xff0c;变量是用来存储和处理数据的基本结构。 二、介绍 1、定义变量 变量名与等号&#xff08;&#xff09;后跟值来定义一个变量&#…

Matlab之操作CSV表格

一、读取csv文件 参数1&#xff1a;csv路径&#xff1b; 参数2&#xff1a;从第几行开始读取&#xff0c;行数从0开始&#xff1b; 参数3&#xff1a;从第几列开始读取&#xff0c;列数从0开始。 ConfigData csvread(ConfigFile,0,1);%读取配置文件 disp(读取CSV文件成功&…

考研数据结构笔记(1)

数据结构&#xff08;1&#xff09; 数据结构在学什么&#xff1f;数据结构的基本概念基本概念三要素逻辑结构集合线性结构树形结构图结构 物理结构&#xff08;存储结构&#xff09;顺序存储链式存储索引存储散列存储重点 数据的运算 算法的基本概念什么是算法算法的五个特性有…

VXLAN:虚拟化网络的强大引擎

1.什么是VXLAN VXLAN&#xff08;Virtual eXtensible Local Area Network&#xff0c;虚拟扩展局域网&#xff09;&#xff0c;是由IETF定义的NVO3&#xff08;Network Virtualization over Layer 3&#xff09;标准技术之一&#xff0c;是对传统VLAN协议的一种扩展。VXLAN的特…

【Spring】Spring事务和事务传播机制

文章目录 什么是事务事务的操作Spring 中事务的实现Spring编程式事务Spring 声明式事务 TransactionalTransactional作用Transactional 详解rollbackFor事务隔离级别Spring 事务隔离级别Spring 事务传播机制 什么是事务 事务&#xff08;Transaction&#xff09;是一个程序中一…

【vue-baidu-map】百度地图组件,实现精准搜索,当前定位功能

实现效果&#xff1a; 代码如下&#xff1a; //引入地图组件 <bmap ref"bmap" map-confirm"confirmPosition" />confirmPosition() {const _this this.$refs.bmapconst center _this.centervar point center.lng , center.latconsole.log(阀控…

JavaEE作业-实验一

目录 1 实验内容 2 思路 3 核心代码 &#xff08;1&#xff09;前端核心代码&#xff1a; &#xff08;2&#xff09;后端核心代码&#xff1a; 4 实验结果 1 实验内容 用Servlet JSP JavaBean实现登录功能 2 思路 ①建好web项目,创建数据库 ②建立两个简单的前端页…

HarmonyOS Next开发----k线图滑动问题

前言 最近做股票软件鸿蒙版本的适配&#xff0c;K线趋势图的手势交互上遇到了问题&#xff0c;这里记录下~ 功能需求&#xff1a; 实现k线趋势图滑动及fling的效果 思路&#xff1a; 1. 借鉴Flutter版本的思路&#xff0c;在K线趋势图上面叠加一个Scroll布局&#xff0c;使…

parted命令进行磁盘分区

1.使用lsblk 查看可用的磁盘 可以看到有sdb sdc两个物理盘还未挂载 2.使用parted命令分区(以sdb为例) 按需要把sdb分成4个逻辑分区 新建磁盘标签类型为gpt 出现提示,输入yes 开始分区: (1)输入mkpart回车,提示输入分区名称,按习惯可命名为sdb1(后面依次sdb2、sdb3)…

LeetCode每日一题 | 1696. 跳跃游戏 VI

文章目录 题目描述问题分析程序代码 题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 一开始你在下标 0 处。每一步&#xff0c;你最多可以往前跳 k 步&#xff0c;但你不能跳出数组的边界。也就是说&#xff0c;你可以从下标 i 跳到 [i 1&#xff0c; min(…

部署篇 | MatrixOne与MySQL全面对比

MatrixOne是一款高度兼容MySQL语法的HTAP数据库&#xff0c;在大部分场景下可以直接实现对MySQL的替换。 作为一款开源数据库&#xff0c;MatrixOne 选用对开发者友好的 Apache-2.0 License&#xff0c;支持在主流的 Linux 和 MacOS 系统中直接进行物理部署。在部署方式上&…

JVM 性能调优 - 参数基础(2)

查看 JDK 版本 $ java -version java version "1.8.0_151" Java(TM) SE Runtime Environment (build 1.8.0_151-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode) 查看 Java 帮助文档 $ java -help 用法: java [-options] class [args...] …

Python中的for循环用法详解,一文搞定它

文章目录 for循环1.for循环的基本语法&#xff08;1&#xff09;遍历不等长多级容器&#xff08;2&#xff09;遍历不等长多级容器&#xff08;3&#xff09;遍历等长的容器 2.变量的解包3.for...else【详细讲解】4.range对象5.总结6.打印 1 ~ 10 跳过57.打印菱形小星星 for循环…

【Linux】select、poll、epoll代码

将fd设置成非阻塞 void setNonBlock(int fd) {int res fcntl(fd, F_GETFL);if (res < 0){std::cerr << "错误" << strerror(errno) << std::endl;return;}fcntl(fd, F_SETFL, res | O_NONBLOCK); } select 1.select系统调用是用来让我们的程…

【ESP32+Python】WIFI连接包括固定账号密码+选择WIFI在输入密码

import network import time# 创建WLAN对象 wlan network.WLAN(network.STA_IF)def scan_and_display_wifi_networks():# 激活接口wlan.active(True)# 扫描附近的WiFi网络networks wlan.scan()print("可用的WiFi网络&#xff1a;")for i, net in enumerate(network…

leetcode 744.寻找比目标字母大的最小字母

本题是二分查找板块中的一个简单题目&#xff0c;不过二分查找比较注重于细节。所以我会着重点出来。 思考&#xff1a;从查找字母这一个要求来说&#xff0c;我们要么选择遍历&#xff0c;要么选择二分查找&#xff0c;因为这里是非递减的&#xff0c;那么我们自然的就会想到…

Flink 动态表 (Dynamic Table) 解读

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

鸿蒙 WiFi 扫描流程(2)

接着上篇没有记录完的&#xff0c;我们继续梳理&#xff0c;需要上一篇做基础的请看&#xff1a;鸿蒙 WiFi 扫描流程&#xff08;1&#xff09; 上一篇我们讲到 scan_service.cpp 里面的 SingleScan 方法&#xff0c;继续这个方法往下看&#xff1a; // foundation/communicat…