【Leetcode】LCP 30. 魔塔游戏

文章目录

  • 题目
  • 思路
  • 代码
  • 结果

题目

题目链接
小扣当前位于魔塔游戏第一层,共有 N 个房间,编号为 0 ~ N-1。每个房间的补血道具/怪物对于血量影响记于数组 nums,其中正数表示道具补血数值,即血量增加对应数值;负数表示怪物造成伤害值,即血量减少对应数值;0 表示房间对血量无影响。

小扣初始血量为 1,且无上限。假定小扣原计划按房间编号升序访问所有房间补血/打怪,为保证血量始终为正值,小扣需对房间访问顺序进行调整,每次仅能将一个怪物房间(负数的房间)调整至访问顺序末尾。请返回小扣最少需要调整几次,才能顺利访问所有房间。若调整顺序也无法访问完全部房间,请返回 -1。

示例 1
输入:nums = [100,100,100,-250,-60,-140,-50,-50,100,150]
输出:1
解释:初始血量为 1。至少需要将 nums[3] 调整至访问顺序末尾以满足要求。

示例 2
输入:nums = [-200,-300,400,0]
输出:-1
解释:调整访问顺序也无法完成全部房间的访问。

提示

  • 1 <= nums.length <= 105
  • -105 <= nums[i] <= 105

思路

在遍历每个房间的过程中,我们始终保持一个原则:尽可能减少调整房间顺序的次数,同时确保在每个房间结束时生命值都大于0。为了达到这个目标,我们采用了一种贪心的策略。

当我们访问到一个房间时,如果该房间的值是负数,我们并不立即处理它,而是将它放入一个小根堆(也就是优先队列,其中元素按照从小到大的顺序排列)中。这样做的原因是,我们希望在生命值不足时,能够找到一个最小的负数来“调整”,即将其放到最后,从而减少它对生命值的即时影响。

如果在某个房间结束时,生命值降到了0或以下,我们就从小根堆中取出最小的元素(也就是之前存储的某个负数房间的值),将它加到生命值上。这个操作相当于将那个房间调整到了最后,因为无论我们如何调整前面的房间顺序,总和是不变的,所以这种贪心选择是最优的。

遍历完所有房间后,我们还需要检查一件事:之前从小根堆中取出的所有元素的和(也就是那些被调整到最后的房间的总影响)需要重新加到生命值上。如果加上这些值后生命值还是小于或等于0,那么就说明无法通过调整房间顺序来保持生命值始终大于0,因此返回-1表示无解。

代码

class Solution {
public:int magicTower(vector<int>& nums){priority_queue<long long, vector<long long>, greater<long long>> q;long long ans = 0, hp = 1, delay = 0;for (int num : nums) {if (num < 0) {q.push(num);}hp += num;if (hp <= 0) {++ans;delay += q.top();hp -= q.top();q.pop();}}hp += delay;if(hp<0)return -1;return ans;}
};

结果

在这里插入图片描述

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

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

相关文章

BUUCTF-Real-[ThinkPHP]IN SQL INJECTION

目录 漏洞描述 漏洞分析 漏洞复现 漏洞描述 漏洞发现时间&#xff1a; 2018-09-04 CVE 参考&#xff1a;CVE-2018-16385 最高严重级别&#xff1a;低风险 受影响的系统&#xff1a;ThinkPHP < 5.1.23 漏洞描述&#xff1a; ThinkPHP是一款快速、兼容、简单的轻量级国产P…

Redis服务

目录 介绍 特点 缓存 安装 安装单机版redis实例 1、创建工作目录 2、下载对应的redis包 3、解压到创建好的工作目录 4、安装编译工具 5、进入解压后的目录执行make编译 6、配置环境变量 7、备份配置文件 8、修改配置文件 9、创建存放数据的目录 配置redis为syste…

Python老司机教你,花几分钟,构建一个Python包

1、前言 构建包的过程有些复杂&#xff0c;但从长远来看是值得的&#xff0c;尤其是可以创建属于自己的Python包。本文的目的是通过对构建一个新发行包的案例研究&#xff0c;让您了解需要构建什么以及如何构建python包的基础知识。 2、开始 首先&#xff0c;您肯定需要设置…

【防止重复提交】Redis + AOP + 注解的方式实现分布式锁

文章目录 工作原理需求实现1&#xff09;自定义防重复提交注解2&#xff09;定义防重复提交AOP切面3&#xff09;RedisLock 工具类4&#xff09;过滤器 请求工具类5&#xff09;测试Controller6&#xff09;测试结果 工作原理 分布式环境下&#xff0c;可能会遇到用户对某个接…

阿里云游戏服务器租用价格表,2024最新报价

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…

PySpark(三)RDD持久化、共享变量、Spark内核制度,Spark Shuffle

目录 RDD持久化 RDD 的数据是过程数据 RDD 缓存 RDD CheckPoint 共享变量 广播变量 累加器 Spark 内核调度 DAG DAG 的宽窄依赖和阶段划分 内存迭代计算 Spark是怎么做内存计算的? DAG的作用?Stage阶段划分的作用? Spark为什么比MapReduce快&#xff1f; Spar…

百度PaddleOCR字符识别推理部署(C++)

1 环境 1.opencv&#xff08;https://sourceforge.net/projects/opencvlibrary/&#xff09; 2.cmake&#xff08;https://cmake.org/download/&#xff09; 3.vs2019&#xff08;(https://github.com/PaddlePaddle/PaddleOCR/tree/release/2.1) 4.paddleOCR项目-建议2.0(http…

CODE V的API 之 MTF数据的获取(2)

MTF数据获取的方法 文章目录 MTF数据获取的方法前言一、基本过程二、具体代码如下总结&#xff08;运行结果&#xff09; 前言 本次实验主要通过VBA&#xff0c;进行 CODE V和 excel连接&#xff0c;同时输出个视场的MTF数据&#xff0c;以便于后续进行处理。 一、基本过程 …

【我与Java的成长记】之封装,继承详解(一)(能看懂文字就能明白系列)

系列文章目录 能看懂文字就能明白系列 C语言笔记传送门 Java笔记传送门 &#x1f31f; 个人主页&#xff1a;古德猫宁- &#x1f308; 信念如阳光&#xff0c;照亮前行的每一步 文章目录 系列文章目录&#x1f308; *信念如阳光&#xff0c;照亮前行的每一步* 前言一、封装&am…

vue2.0+使用md-edit编辑器

前言&#xff1a;小刘开发过程中&#xff0c;如果是博客项目一般是会用到富文本。众多富文本中&#xff0c;小刘选择了markdown&#xff0c;并记录分享了下来。 # 使用 npm npm i kangc/v-md-editor -Smain.js基本配置import VueMarkdownEditor from kangc/v-md-editor; import…

Oracle systemstate、gdb、dbx介绍

当数据库出现严重的性能问题或者hang了的时候&#xff0c; 可能最常用的办法就是重启数据库&#xff0c;简单有效解决问题&#xff1b;但是重启后如何追踪问题的根本原因成了难题&#xff0c;很多信息随着重启也消失不见了&#xff0c;让追查问题变的十分棘手&#xff0c;这时就…

配置Jenkins自动构建打包项目

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 需求说明 1、给A项目配置jenkins每2小时无条件自动构建一次&#xff0c;无论是否有代码提交。 2、给B项目配置jenkins每15分钟检…