蓝桥备赛——堆队列

 

AC code 

import os
import sys
import heapq
a = []
b = []
n,k = map(int,input().split())for _ in range(n):x,y = map(int,input().split())a.append(x)b.append(y)
q = []# 第一种情况:不打第n个怪兽# 将前n-1个第一次所需能量加入堆
for i in range(n-1):heapq.heappush(q,(a[i],i))t = k
ans = 0
while t > 0:
# 每次从堆中弹出最小的一个w,i = heapq.heappop(q)
#然后弹入第二次以后击打所需能量heapq.heappush(q,(b[i],i))
#答案加上该能量ans += w
#次数减一t -= 1# 第二种情况:考虑打第n个怪兽
ans2 = 0
#因为前n-1个一定要打,所以要打到n就必须保证击打次数大于等于n
if k >= n:
#因为前n-1个一定要打,所以先把所有第一次击打所需能量加和,
#然后再加上所有第二次以后击打所需能量的最小值*剩余击打次数ans2 += sum(a) + (k-n) * min(b)# 取最小值
if k >= n:print(min(ans,ans2))
else:print(ans)

感觉这道题除了使用了heapq(堆排列)之外,没有使用其他的数据结构知识。 

背景知识

在介绍堆排列之外,先补充一些有关大根堆、小根堆的知识

大根堆

每个结点的值都大于其左孩子和右孩子结点的值,称之为大根堆。

小根堆

每个结点的值都小于其左孩子和右孩子结点的值,称之为小根堆。

结合上述图片可直观看出来。

 我们将上面图片按照标号进行映射,可以获得对应的数组如下图所示(注意,此方法是一个重要的过程,涉及到如何将图转化为程序代码,也是我原来一直困惑的地方)

如上图,成功将树的形式转换成了数组(列表)形式了。

堆的特点就是FIFO(first in first out)先进先出。
堆在接收数据的时候先接收的数据会被先弹出。
栈的特性正好与堆相反,是属于FILO(first in/last out)先进后出的类型。

 heapq库常见函数及用法

简单了解了大小根堆后,对于heapq库大家应该有更好的理解了。

首先,介绍一下heapq的用法。

heapq属于Python的一个内置库,里面

heappush函数

import heapq
item=[1,56,7,54,33]
heapq.heappush(item,10)
print(item)[1, 56, 7, 54, 33, 10]Process finished with exit code 0

上述代码可知,heappush函数对应就是尾插法插入堆中新元素。

heappop函数

import heapq
item=[1,56,7,54,33]
heapq.heappop(item)
print(item)[7, 56, 33, 54]Process finished with exit code 0

将heap的最小值pop出heap,heap为空时报IndexError错误.

此处有一个注意事项,将最小值pop出堆后,会出现原item顺序改变的情况,why?

`heapq.heappop()` 函数在 Python 中会从堆中移除并返回最小的元素。然而,它不保证保持原始顺序。你观察到顺序变化的原因是因为 `heapq` 模块维护堆属性,即最小的元素始终位于根部,但不保证剩余元素的顺序。

当你执行 `heapq.heappop(item)` 时,最小的元素(在这里是 `1`)从堆(`item` 列表)中移除,并且堆属性被恢复。这个操作可能涉及重新排序列表中的元素以保持堆结构,从而导致与原始列表不同的顺序。

如果你想在移除元素时保持原始顺序,你应该使用其他方法,比如在使用堆操作之前对列表进行排序,或者维护一个单独的列表来保存原始顺序。

heappushpop(heap,item)

不再过多解释,两个参数,一个进一个出

pop出heap中最小的元素,推入item。

import heapq
item=[1,56,7,54,33]
heapq.heappushpop(item,12)
print(item)[7, 56, 12, 54, 33]Process finished with exit code 0

以上就是常见的heapq库中函数相关用法。

本题思路

首先考虑在不击败最后一个boss的情况下:

        每种怪兽只打一次,对应所需要的能量值为多少。最后再求出对应继续打怪兽,(消灭第二次),直到对应龙之泪达到所需要求。

        第二类情况,考虑消灭最后一只龙的情况,这时需要特判,考虑打最后一只怪兽的条件,对应要求n-1只怪兽要全部消灭至少一次。即总打击次数>=n,然后再加上所有第二次以后击打所需能量的最小值*击打次数。

        最终将两类情况对应的能量消耗取最小值即为最终结果。

不知各位道友看完此篇博客之后,有没有变得念头通达了呢?【手动狗头】

        

参考链接:

堆排序及python中heapq堆详解_heapq 用法 实现大根堆-CSDN博客

Python内置的heapq模块简析_python heappush 指定排序-CSDN博客 

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Doris实践——叮咚买菜基于OLAP引擎的应用实践

目录 前言 一、业务需求 二、选型与对比 三、架构体系 四、应用实践 4.1 实时数据分析 4.2 B端业务查询取数 4.3 标签系统 4.4 BI看板 4.5 OLAP多维分析 五、优化经验 六、总结 原文大佬介绍的这篇Doris数仓建设实践有借鉴意义的,这些摘抄下来用作沉淀学…

NFT Insider #125:Astar将与索尼开发的新公链将关注游戏或 NFT 等众多领域

引言:NFT Insider由NFT收藏组织WHALE Members (https://twitter.com/WHALEMembers)、BeepCrypto (https://twitter.com/beep_crypto)联合出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜…

TR2 - Transformer模型的复现

目录 理论知识模型结构结构分解黑盒两大模块块级结构编码器的组成解码器的组成 模型实现多头自注意力块前馈网络块位置编码编码器解码器组合模型最后附上引用部分 模型效果总结与心得体会 理论知识 Transformer是可以用于Seq2Seq任务的一种模型,和Seq2Seq不冲突。 …

STL —— vector(1)

博主首页: 有趣的中国人 专栏首页: C专栏 本篇文章主要讲解vector使用的相关内容 1. vector简介 vector 是 C 标准库中的一个容器类模板,它提供了动态数组的功能,可以方便地管理和操作元素的集合。下面是关于 vector 的一些基本信…

NRF24L01P和SI24R1的区别

NRF24L01无线模块广泛地运用于:无线门禁、无线数据通讯、安防系统、遥控装置、遥感 勘测、智能运动设备、工业传感器;平常我们用到的无线鼠标基本上采用的都是NORDIC的N RF24L01无线模块方案,而且,只需要一个5号电池即可。 几年前…

HarmonyOS实战开发-如何实现一个自定义抽奖圆形转盘

介绍 本篇Codelab是基于画布组件、显式动画,实现的一个自定义抽奖圆形转盘。包含如下功能: 通过画布组件Canvas,画出抽奖圆形转盘。通过显式动画启动抽奖功能。通过自定义弹窗弹出抽中的奖品。 相关概念 Stack组件:堆叠容器&am…

详解TCP的三次握手和四次挥手

文章目录 1. TCP报文的头部结构2. 三次握手的原理与过程三次握手连接建立过程解析 3. 四次挥手的原理与过程四次挥手连接关闭过程的解析 4. 常见面试题 深入理解TCP连接:三次握手和四次挥手 在网络通信中,TCP(传输控制协议)扮演着…

人才推荐 | 材料化学博士,热衷于创新且可扩展的电池技术开发

编辑 / 木子 审核 / 朝阳 伟骅英才 伟骅英才致力于以大数据、区块链、AI人工智能等前沿技术打造开放的人力资本生态,用科技解决职业领域问题,提升行业数字化服务水平,提供创新型的产业与人才一体化服务的人力资源解决方案和示范平台&#x…

java多线程——概述,创建方式及常用方法

前言: 学习到多线程了,整理下笔记,daydayup!!! 多线程 什么是线程 线程(Thread)是一个程序内部的一条执行流程。若程序只有一条执行流程,那这个程序就是单线程的程序。 什么是多线程 多线程是指从软硬件上…

【AIGC】如何在Windows/Linux上部署stable diffusion

文章目录 整体安装步骤windows10安装stable diffusion环境要求安装步骤注意事项参考博客其他事项安装显卡驱动安装cuda卸载cuda安装对应版本pytorch安装git上的python包Q&A linux安装stable diffusion安装anaconda安装cudagit 加速配置虚拟环境挂载oss(optional…

传播力研究期刊投稿发表

《传播力研究》杂志是经国家新闻出版总署批准,黑龙江日报报业集团主管主办,面向全国公开发行的学术刊物。本刊为新闻、传媒、传播学类专业院校师生、文化传播理论研究者和从业人员及爱好者,开展学术交流与研讨,汲取当今业界新鲜的…

RGB,深度图,点云和体素的相互转换记录

目录 1.RGBD2Point 1.2 步骤 2.Point2Voxel-Voxelization 2.1 原理 2.2 代码 3.Voxel2Point 4.Point2RGB 5.Voxel2RGB 1.RGBD2Point input:RGB D 内外惨 output:points cloud def depth2pcd(depth_img):"""深度图转点云数据图…

翻译 《The Old New Thing》 - Why is a registry file called a “hive“?

Why is a registry file called a “hive“?https://devblogs.microsoft.com/oldnewthing/20030808-00/?p42943 为什么注册表文件被称为‘蜂巢’? Raymond Chen 2003年8月8日 分享一个没用的知识: 话说有一位 Windows NT 的开发者十分讨厌蜜蜂。于是&a…

FLV流媒体封装格式

1、FLV 简介 FLV(Flash Video) 是 Adobe 公司推出的一种流媒体格式,由于其封装后的音视频文件体积小、封装简单等特点,非常适合于互联网上使用。目前主流的视频网站基本都支持FLV。采用 FLV 格式封装的文件后缀为.flv。直播场景下拉流比较常见的是 http-…

计算机网络:现代通信的基石

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

小白了解Pinia第2集 · 三大核心状态Getters、Actions以及Plugins 插件

三大核心状态 state 第1集有详细讲解:https://blog.csdn.net/qq_51463650/article/details/137137080?spm1001.2014.3001.5501 getters Getter 完全等同于 Store 状态的 计算值。 它们可以用 defineStore() 中的 getters 属性定义。 他们接收“状态”作为第一个…

Elastic 8.13:Elastic AI 助手中 Amazon Bedrock 的正式发布 (GA) 用于可观测性

作者:来自 Elastic Brian Bergholm 今天,我们很高兴地宣布 Elastic 8.13 的正式发布。 有什么新特性? 8.13 版本的三个最重要的组件包括 Elastic AI 助手中 Amazon Bedrock 支持的正式发布 (general availability - GA),新的向量…

汽车电子行业知识:什么是智能驾驶辅助系统(ADAS)

文章目录 1. 什么是智能驾驶辅助系统(ADAS)1.1 ADAS的功能1.2 ADAS的优势1.3 未来发展趋势 2. ADAS等级2.1. 0级驾驶辅助2.2. 1级驾驶辅助2.3. 2级驾驶辅助2.4. 3级驾驶辅助2.5. 4级和5级驾驶辅助 3. 智能车4. ADAS供应商 1. 什么是智能驾驶辅助系统&…

文章分享:协和文章《病原宏基因组高通量测序性能确认方案》

摘要:宏基因组学利用新一代高通量测序技术,以特定环境下病原体基因组为研究对象,在分析病原体多样性、种群结构、进化关系的基础上,进一步探究病原体的群体功能活性、相互作用及其与环境之间的关系,发掘潜在的生物学意…

STM32之HAL开发——串口配置(CubeMX)

串口引脚初始化(CubeMX) 选择RCC时钟来源 选择时钟频率,配置为最高频率72MHZ 将单片机调试模式打开 SW模式 选择窗口一配置为异步通信模式 点击IO口设置页面,可以看到当前使用的串口一的引脚。如果想使用复用功能,只需…