蓝桥备赛——堆队列

news/2024/5/15 23:49:50/文章来源:https://blog.csdn.net/weixin_60535956/article/details/137154381

 

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.luyixian.cn/news_show_1028666.aspx

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

相关文章

Selenium 自动化 —— 浏览器窗口操作

更多内容请关注我的专栏: 入门和 Hello World 实例使用WebDriverManager自动下载驱动Selenium IDE录制、回放、导出Java源码 当用 Selenium 打开浏览器后,我们就可以通过 Selenium 对浏览器做各种操作,就像我们日常用鼠标和键盘操作浏览器一…

c++初阶篇----string的底层模拟

string类的模拟 目录 string类的模拟功能介绍各功能的实现类的构造函数,拷贝构造函数,析构函数迭代器的实现string的内部容量访问成员函数string的修改成员函数string类的相关联函数string类的输入输出友元 汇总string功能的实现汇总测试代码 功能介绍 …

151 shell编程,正则表达式,在C语言中如何使用正则表达式

零,坑点记录:bash 和 dash 的区别,导致的坑点 查看当前用的shell 是啥,用的是/bin/bash hunandedehunandede-virtual-machine:~$ echo $SHELL /bin/bash 当shell 脚本运行的时候(后面会学到方法,这里是最…

Django屏蔽Server响应头信息

一、背景 最近我们被安全部门的漏洞扫描工具扫出了一个服务端口的漏洞。这个服务本身是一个Django启动的web服务,并且除了登录页面,其它页面或者接口都需要进行登录授权才能进行访问。 漏洞扫描信息和提示修复信息如下: 自然这些漏洞如何修复&#xff0c…

图论- 最小生成树

一、最小生成树-prim算法 1.1 最小生成树概念 一幅图可以有很多不同的生成树,比如下面这幅图,红色的边就组成了两棵不同的生成树: 对于加权图,每条边都有权重(用最小生成树算法的现实场景中,图的边权重…

每天五分钟深度学习:使用神经网络完成人脸的特征点检测

本文重点 我们上一节课程中学习了如何利用神经网络对图片中的对象进行定位,也就是通过输出四个参数值bx、by、bℎ和bw给出图片中对象的边界框。 本节课程我们学习特征点的检测,神经网络可以通过输出图片中对象的特征点的(x,y)坐标来实现对目标特征的识别,我们看几个例子。…

java 溯本求源之基础(八)之 jar(下篇)

上篇中我们介绍了 Java 类加载顺序、JAR 命令的使用以及 MANIFEST.MF 文件的作用。Java 类加载顺序包括 Bootstrap classes、Extension classes 和 Class Path。JAR 命令是一个归档和压缩工具,用于打包 Java 应用程序。MANIFEST.MF 文件存储打包文件的元信息&#x…

Midjourney AI绘图工具介绍及使用

介绍 Midjourney是一款目前被誉为最强的AI绘图工具。只要输入想到的文字,就能通过人工智能产出相对应的图片。 官网只是宣传和登录入口,提供个人主页、订阅管理等功能,Midjourney实际的绘画功能,是在另外一个叫discord的产品中实…

关于未来自我的发展和一些学习方法(嵌入式方向)

我是一名大二的学生,考研还是就业,到底是重视专业课还是重视数学英语,这些问题一直困扰了我很久,但如今已经有了一些浅显的认识,所以才会想写这样一篇文章来记录一下自己的状态和未来的规划 下面的看法都是个人的看法&…

Day26 手撕各种集合底层源码(一)

Day26 手撕各种集合底层源码(一) 一、手撕ArrayList底层源码 1、概念: ArrayList的底层实现是基于数组的动态扩容结构。 2、思路: 1.研究继承关系 2.研究属性 3.理解创建集合的过程 – 构造方法的底层原理 4.研究添加元素的过程…

wpf 自定义命令

自定义命令 MyCommand.cs public class MyCommand : ICommand {private readonly Action<Object> execAction;private readonly Func<Object,bool> changedFunc;public event EventHandler? CanExecuteChanged;public MyCommand(Action<object> execAction…

离线linux服务器安装mysql8

本文的服务器环境&#xff1a;openEuler毛坯版的&#xff0c;很多常用的指令都没有预装&#xff0c;比如rpm、tar等等&#xff0c;没有网络坏境&#xff0c;需要自己手动配置本地yum仓库&#xff0c;安装相关指令 1、检查服务器是否已经安装了MySQL 1.1、查询mysql以安装的相关…

NRF52832修改OTA升级时的bootloader蓝牙MAC

NRF52832在OTA升级时&#xff0c;修改了APP的蓝牙MAC会导致无法升级&#xff0c;原因是OTA程序的蓝牙MAC没有被修改所以手机扫描蓝牙时无法连接 解决办法 在bootloader的程序里面加入修改蓝牙mac地址的代码实现原理&#xff1a; 在bootloader蓝牙广播开启之前修改蓝牙mac 通…

无人车网关案例:记SV900无人清扫车网关的现场应用

​随着无人驾驶技术的不断发展,无人车辆已经开始广泛应用于物流配送、环境保洁、巡逻监控等众多领域,助力城市运营更加高效智能。而要实现无人车辆的安全可靠运行,关键在于选择一款性能卓越的车载网络通信系统.在这一背景下,星创易联推出了SV900无人车网关系列产品。它集5G/4G网…

算法打卡day17

今日任务&#xff1a; 1&#xff09;654.最大二叉树 2&#xff09;617.合并二叉树 3&#xff09;700.二叉搜索树中的搜索 4&#xff09;98.证二叉搜索树 654.最大二叉树 题目链接&#xff1a;654. 最大二叉树 - 力扣&#xff08;LeetCode&#xff09; 给定一个不含重复元素的整…

计算机网络数据链路层知识总结

物理层知识总结传送门 计算机网络物理层知识点总结-CSDN博客 功能 功能概述 一些基本概念 结点:主机、路由器链路﹔网络中两个结点之间的物理通道&#xff0c;链路的传输介质主要有双绞线、光纤和微波。分为有线链路、无线链路。数据链路︰网络中两个结点之间的逻辑通道&a…

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

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

STM32第十节(中级篇):EXTI(第一节)——EXTI功能框图及初始化结构体讲解(包括STM32中断应用总结)

目录 前言 STM32第十节&#xff08;中级篇&#xff09;&#xff1a;EXTI&#xff08;第一节&#xff09;——EXTI功能框图及初始化结构体讲解&#xff08;包括STM32中断应用总结&#xff09; EXTI功能框图 EXTI初始化结构体讲解 STM32中断应用总结 NVIC介绍 优先级 优先…

后端常问面经之并发

volatile 关键字 volatile关键字是如何保证内存可见性的&#xff1f;底层是怎么实现的&#xff1f; "观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现&#xff0c;加入volatile关键字时&#xff0c;会多出一个lock前缀指令”lock前缀指令实际上相…

Radash一款JavaScript最新的实用工具库,Lodash的平替!

文章目录 Lodash 的痛点进入正题--Radash特点 举例几个常用的api 一说lodash应该大部分前端同学都知道吧&#xff0c;陪伴我们好多年的JavaScript工具库&#xff0c;但是自从 ES6 出现后就慢慢退出前端人的视线&#xff0c;能ES6写的代码绝对不会用Lodash&#xff0c;也不是完全…