蓝桥备赛——堆队列

 

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.hqwc.cn/news/578190.html

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

相关文章

使用anime.js实现列表滚动轮播

官网&#xff1a;https://animejs.com/ html <div id"slide1"><div class"weather-item" v-for"item in weatherList"><div><img src"../../images/hdft/position.png" alt"">{{item.body.cityInf…

DVWA-CSRF通关教程-完结

DVWA-CSRF通关教程-完结 文章目录 DVWA-CSRF通关教程-完结Low页面使用源码分析漏洞利用 Medium源码分析漏洞利用 High源码分析漏洞利用 impossible源码分析 Low 页面使用 当前页面上&#xff0c;是一个修改admin密码的页面&#xff0c;只需要输入新密码和重复新密码&#xff…

LeetCode:718最长重复子数组 C语言

718. 最长重复子数组 提示 给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出&#xff1a;3 解释&#xff1a;长度最长的公共子数组是 [3,…

protobuf学习笔记(二):结合grpc生成客户端和服务端

上一篇文章大概讲了如何将自定义的protobuf类型的message转换成相应的go文件&#xff0c;这次就结合grpc写一个比较认真的客户端和服务器端例子 一、项目结构 client存放rpc服务的客户端文件 server存放rpc服务的服务端文件 protobuf存放自定义的proto文件 grpc存放生成的g…

IP可以申请SSL证书吗?

目录 背景&#xff1a; 申请IP证书的基本条件&#xff1a; 支持IP地址的证书类型&#xff1a; 为什么要申请IP地址证书&#xff1f; 如何申请IP地址证书 背景&#xff1a; IP地址是可以实现https加密需求的&#xff0c;且IP SSL证书可以完美的解决企业对于IP地址实现http…

第十四届蓝桥杯省赛C++ C组所有题目以及题解(C++)【编程题均通过100%测试数据】

第一题《求和》【简单模拟】 【问题描述】 求1&#xff08;含&#xff09;至20230408&#xff08;含&#xff09;中每个数的和。 【答案提交】 这是一道结果填空的题&#xff0c;你只需要算出结果后提交即可。本题的结果为一个整数&#xff0c;在提交答案时只填写这个整数&…

C++ —— C++11新增语法

目录 一&#xff0c;列表初始化 1.1 这是什么&#xff1f; 1.2 initializer_list 1.3 在容器的运用 1.4 STL中的变化 二&#xff0c;右值引用和左值引用 2.1 是什么&#xff1f; 2.2 这两个东西有啥关系&#xff1f; 2.3 有啥用&#xff1f; 三&#xff0c;*移动构…

【c 语言 】malloc函数详解

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

Pytorch复现 Transformer cssdn

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;TensorFlow入门实战&#xff5c;第3周&#xff1a;天气识别&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 一、多头注意力机制 import torch import…

智慧油站系统的物联网技术方案

智慧油站系统的物联网技术方案 智慧油站远程监控云平台是物联网技术在石油能源行业的深度应用&#xff0c;通过集成先进的传感器技术、大数据分析、云计算及人工智能等前沿科技手段&#xff0c;实现对加油站运营全流程的智能化管理与服务升级。其物联网技术方案主要包括以下几…

Linux(4)常见操作整理-静态路由-双网卡-文件上传下载-运维思路-性能监测方法-jar包查找

五、常见操作 1、静态路由配置 【描述】&#xff1a;当前ifconfig eno16777728 对应ip&#xff1a;172.41.0.120 【解决】&#xff1a; &#xff08;1&#xff09; [rootlocalhost ~]# cd /etc/sysconfig/network-scripts/ &#xff08;2&#xff09; 添加文件&#xff1a…

k8s笔记28--快速在ubuntu上基于二进制和源码安装containerd

k8s笔记28--快速在ubuntu上基于二进制和源码安装containerd 介绍containerd 安装方法二进制文件安装源码构建安装 注意事项说明 介绍 Containerd是一个工业标准的容器运行时&#xff0c;它强调简单、健壮和可移植性。它可作为Linux和Windows的守护进程&#xff0c;能管理主机系…