蓝桥备赛——堆队列

news2025/2/2 11:09:52

 

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://www.coloradmin.cn/o/1555275.html

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

相关文章

安装和使用 Oracle Database 23c 容器鏡像

Oracle Database 23c 是 Oracle 最新的数据库版本,它带来了许多新特性和性能改进。 对于开发者来说,Oracle 提供了一个免费的开发者版, 可以通过 Docker 容器轻松安装和使用。以下是详细的安装和使用指南。 安装 Docker 在开始之前&#xff0…

全局UI方法-弹窗二-列表选择弹窗(ActionSheet)

1、描述 定义列表弹窗 2、接口 ActionSheet.show(value:{ title: string | Resource, message: string | Resource, autoCancel?: boolean, confrim?: {value: string | Resource, action: () > void }, cancel?: () > void, alignment?: DialogAlignment, …

C++template之类模版进一步了解

前言:这一篇是在我的上一篇文章的基础上,再进一步所写的。 链接:CTemplate<>模版的介绍及深度解析-CSDN博客 一、类模板实例化 1.非类型模版参数 类型模版参数:就是跟在 class后面或者typename后的类型 非…

【软考---系统架构设计师】特殊的操作系统介绍

目录 一、嵌入式系统(EOS) (1)嵌入式系统的特点 (2)硬件抽象层 (3)嵌入式系统的开发设计 二、实时操作系统(RTOS) (1)实时性能…

【动手学深度学习-pytorch】-9.3深度循环神经网络

到目前为止,我们只讨论了具有一个单向隐藏层的循环神经网络。 其中,隐变量和观测值与具体的函数形式的交互方式是相当随意的。 只要交互类型建模具有足够的灵活性,这就不是一个大问题。 然而,对一个单层来说,这可能具有…

【2024系统架构设计】案例分析- 4 嵌入式

目录 一 基础知识 二 真题 一 基础知识 1 基本概念 ◆系统可靠性是系统在规定的时间内及规定的环境条件下,完成规定功能的能力,也就是系统无故障运行的概率。或者,可靠性是软件系统在应用或系统错误面前,在意外或错误使用的情况下维持软件系统的功能特性的基本能力。

三菱Q系列PLC以太网TCP通讯FB块源码

三菱Q系列PLC的tcp通讯,客户端和服务器两个变量好用的FB块,调用块就可以实现通讯连接,不需要自己写程序,简单配置引脚就可以。该块还集成了断网,连接错误,发送接收数据错误报警等功能。具体功能见下面介绍.…

Java 并发编程之volatile可见性,原子操作线程不安全

volatile 关键字 在修饰的变量,在系统汇编的代码里会生成lock前缀,表示指令在多核CPU情况下,在当前处理器将缓存数据写回到系统主内存时,会引起其他CPU缓存了该内存地址的数据无效。 作用:保证线程的可见性&#xff…

UKP3d,AutoPDMS出轴测图时的焊点设置

焊点的设置是关联元件库里的连接方式(焊点设置不成功,请查看元件的连接方式),看元件的连接方式如下: 转到两次查看元件连接类型

动态内存管理+柔性数组

动态内存存在的意义 C语言是一种过程式编程语言,提供了底层访问能力和丰富的功能,广泛应用于操作系统、嵌入式系统、硬件驱动程序等领域。C语言的动态内存管理主要是通过malloc()、calloc()、realloc()和free()这几个标准库函数来实现的。 理解动态内存…

单调栈的使用一:接雨水

文章目录 1、单调栈接雨水的过程2、算法正确性的关键点:3、简化理解:4、算法的实现 题目路径: 42.接雨水 其他解法: 接雨水(动态规划/双指针/贪心) 单调栈原理: 单调栈和单调队列 单调栈直接…

Topaz Video AI for mac 视频增强软件

Topaz Video AI for Mac是一款专为Mac用户设计的视频增强软件,它利用先进的人工智能技术和机器学习算法,为用户提供卓越的视频编辑和增强体验。 软件下载:Topaz Video AI for mac v4.2.2激活版 这款软件能够快速提高视频的清晰度、色彩饱和度…

Python Flask Web框架初步入门

前言 flask基础 搭建flask服务器 定义html 使用templates模板定义页面的html html页面编写 render_template传参变量 定义图片 创建static目录,存入图片 html编写 flask入门 网站多域名 网站之间超链接跳转 入门案例 将centos的rpm包下载链接集成到自…

Linux(CentOS7.5) 安装部署 Python3.6(超详细!包含 Yum 源配置!)

文章目录 1.配置 Yum 源2.下载 Python3 包3. 解压4.安装依赖环境5.安装出错场景 6.创建软链接7.配置 Python3 的环境变量8.验证补充:安装 openssl-devel补充:pip3 源配置 1.配置 Yum 源 # 注意!!!请先切换到 root 账号…

什么是搜索引擎(SEO)爬虫它们是如何工作的?

什么是搜索引擎(SEO)爬虫&它们是如何工作的? 你的网站上有蜘蛛🕷️。别抓狂!我说的不是真正的八条腿的蜘蛛🕷️。 我指的是搜索引擎优化爬虫。他们是实现SEO的机器人。每个主要的搜索引擎都使用爬虫来…

存储阵列从哪些方面改善影视后期制作环境

在4K/8K视频越来越成为影视制作主流的今天,超大的影视文件给项目按时完成带来了严重的挑战。对于影视工作室来说要想赶上进度,在存储的选择上通常有三个难题亟待解决:怎么搭建高性能影视协作环境? 文件量增长怎么扩展现有的存储? 如何有效的…

NumPy介绍及其应用领域

1.NumPy介绍 ​NumPy(Numerical Python)是 Python 的一个开源的扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。NumPy的前身为Numeric,起初由Jim Hugunin与其他协作者共同开发&…

Elment ui 动态表格与表单校验 列表数据 组件

组件做个记录&#xff0c;方便以后会用到。 效果&#xff1a; 代码 &#xff1a; <template><el-dialog title"商品详情" :visible.sync"dialogVisible" width"80%"><el-tabs v-model"activeTab"><el-tab-pane…

数据可视化Grafana Windows 安装使用教程(中文版)

1.跳转连接 天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/site?url 2.下载应用程序 官网地址&#xff1a;Grafana get started | Cloud, Self-managed, Enterprisehttps://grafana.com/get/ 3.修改配置文件 grafana\conf\defaults 4.启动\bin\目录下serve应用程序 浏…

C#属性显示

功能&#xff1a; 显示对象的属性&#xff0c;包括可显示属性、可编辑属性、及不可编辑属性。 1、MainWindow.xaml <Window x:Class"FlowChart.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://sche…