【Leetcode】LCP 30. 魔塔游戏

news2024/11/18 6:33:59

文章目录

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

题目

题目链接
小扣当前位于魔塔游戏第一层,共有 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.coloradmin.cn/o/1443319.html

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

相关文章

Apache Zeppelin 整合 Spark 和 Hudi

一 环境信息 1.1 组件版本 组件版本Spark3.2.3Hudi0.14.0Zeppelin0.11.0-SNAPSHOT 1.2 环境准备 Zeppelin 整合 Spark 参考&#xff1a;Apache Zeppelin 一文打尽Hudi0.14.0编译参考&#xff1a;Hudi0.14.0 最新编译 二 整合 Spark 和 Hudi 2.1 配置 %spark.confSPARK_H…

moduleID的使用

整个平台上有很多相同的功能&#xff0c;但是需要不同的内容。例如各个模块自己的首页上有滚动新闻、有友好链接等等。为了公用这些功能&#xff0c;平台引入了moduleID的解决方案。 在前端的配置文件中&#xff0c;配置了模块号&#xff1a; 前端页面请求滚动新闻时&#xff0…

Sam Altman计划筹集5至7万亿美元;OPPO发布AI时代新功能

&#x1f989; AI新闻 &#x1f680; Sam Altman计划筹集5至7万亿美元&#xff0c;建立全球芯片帝国 摘要&#xff1a;Sam Altman宣布计划筹集5至7万亿美元来建立全球芯片帝国&#xff0c;以满足日益增长的AI基础设施需求。他已在全球寻求资金&#xff0c;包括中东土豪。此外…

Flume拦截器使用-实现分表、解决零点漂移等

1.场景分析 使用flume做数据传输时&#xff0c;可能遇到将一个数据流中的多张表分别保存到各自位置的问题&#xff0c;同时由于采集时间和数据实际发生时间存在差异&#xff0c;因此需要根据数据实际发生时间进行分区保存。 鉴于此&#xff0c;需要设计flume拦截器配置conf文件…

Java 内存区域介绍

&#xff08;1&#xff09;程序计数器 程序计数器主要有两个作用&#xff1a; 字节码解释器通过改变程序计数器来依次读取指令&#xff0c;从而实现代码的流程控制&#xff0c;如&#xff1a;顺序执行、选择、循环、异常处理。 在多线程的情况下&#xff0c;程序计数器用于记录…

【开源】JAVA+Vue.js实现计算机机房作业管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登录注册模块2.2 课程管理模块2.3 课时管理模块2.4 学生作业模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 课程表3.2.2 课时表3.2.3 学生作业表 四、系统展示五、核心代码5.1 查询课程数据5.2 新增课时5.3 提交作…

360 安全浏览器 - 页面布局 - 常用网址

360 安全浏览器 - 页面布局 - 常用网址 自定义样式 let myStyle {https://www.baidu.com/: {color: #001483,backgroundColor: #FFF,icon: https://www.baidu.com/favicon.ico},https://blog.csdn.net/jx520: {backgroundColor: #fc5531,icon: https://g.csdnimg.cn/static/l…

离线数仓(一)【数仓概念、需求架构】

前言 今天开始学习数仓的内容&#xff0c;之前花费一年半的时间已经学完了 Hadoop、Hive、Zookeeper、Spark、HBase、Flume、Sqoop、Kafka、Flink 等基础组件。把学过的内容用到实践这是最重要的&#xff0c;相信会有很大的收获。 1、数据仓库概念 1.1、概念 数据仓库&#x…

【Linux】指令提权-sudo

Hello everybody&#xff0c;新年快乐&#xff01;哈哈&#xff01;今天打算给大家讲讲指令提权的相关知识&#xff0c;虽然内容不多&#xff0c;但有时却很有用。在我们学习过权限&#xff0c;vim后就可以学习指令提权啦&#xff0c;没看过的宝子们建议先去看一看我之前的文章…

〖大前端 - ES6篇②〗- let和const

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

缓存穿透、缓存击穿与缓存雪崩

缓存穿透、缓存击穿与缓存雪崩 1.本质区别 缓存穿透指的是数据库不存在数据&#xff0c;导致无法缓存&#xff0c;每次查询都查数据库&#xff0c;数据库压垮 缓存击穿指的是缓存键值对key过期了&#xff0c;key过期期间&#xff0c;大量请求访问&#xff0c;不经过缓存&…

Python操作MySQL基础

除了使用图形化工具以外&#xff0c;我们也可以使用编程语言来执行SQL从而操作数据库。在Python中&#xff0c;使用第三方库: pymysql来完成对MySQL数据库的操作。 安装第三方库pymysql 使用命令行,进入cmd&#xff0c;输入命令pip install pymysql. 创建到MySQL的数据库连接…

代码随想录算法训练营day15||二叉树part02、102.二叉树的层序遍历、 226.翻转二叉树(优先掌握递归)、101. 对称二叉树 (优先掌握递归)

102.二叉树的层序遍历 题目&#xff1a;给你一个二叉树&#xff0c;请你返回其按 层序遍历 得到的节点值。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 接下来我们再来介绍二叉树的另一种遍历方式&#xff1a;层序遍历。 层序遍历一个二叉树。就是…

VDB-具有动态拓扑的高分辨率稀疏体积表示方法

论文地址&#xff1a;Museth_TOG13.pdf 概述 论文提出了一个称为VDB的新颖数据结构和算法&#xff0c;它可以高效地表示三维网格上的稀疏、随时间变化的数据。 VDB的数据结构基于B树&#xff0c;包含一个动态的根节点&#xff0c;以及多个内部节点和叶节点层次&#xff0c;这…

CVE-2021-44915 漏洞复现

CVE-2021-44915 路由/admin/admin.php是后台&#xff0c;登录账号和密码默认是admin、tao&#xff0c;选择管理栏目菜单。 点击编辑&#xff0c;然后随便改点内容&#xff0c;提交时候抓包。 id是注入点。直接拿sqlmap跑就行了。

滑块验证码识别代码分享

平时我们开发爬虫会遇到各种各样的滑动验证码&#xff0c;如下图所示&#xff1a; 为了解决这个问题&#xff0c;我写了一个通用的滑块验证码识别代码&#xff0c;主要是分析图片&#xff0c;然后计算出滑块滑动的像素距离。但是像素距离大多数情况下都不会等于滑动距离&#x…

2月7日《CS2》终于放大招,玩家激情再次被点燃

2024.2.7号&#xff0c;也就是昨天&#xff0c;V社终于放了大招&#xff0c;对CS2做了高达5个多G的大更新&#xff0c;这次更新内容还是比较多的&#xff0c;说几个比较有意思的点吧。 1、新武器箱&#xff1a;千瓦武器箱&#xff01; 全新的武器箱千瓦箱&#xff0c;能开出全…

SAP-PP-01-005工作中心

前言 工作中心是用于生产产品的生产资源&#xff0c;包括机器、人和设备&#xff0c;是各种生产或能力加工单元的总称。工作中心属于能力的范畴即计划的范畴&#xff0c;而不属于固定资产或者设备管理的范畴。一个工作中心可以是一台设备、一组功能相同的设备、一条自动生产线、…

RocketMQ(二):领域模型(生产者、消费者)

1 生产者&#xff08;Producer&#xff09; 本节介绍Apache RocketMQ 中生产者的定义、模型关系、内部属性、版本兼容和使用建议。 1.1 定义 生产者是Apache RocketMQ 系统中用来构建并传输消息到服务端的运行实体。 生产者通常被集成在业务系统中&#xff0c;将业务消息按照要…

C语言KR圣经笔记 7.1标准输入和输出 7.2格式化输出-printf

第七章 输入和输出 输入和输出功能并不是 C 语言本身的一部分&#xff0c;故到目前为止&#xff0c;本书都没有对其着重说明。然而&#xff0c;程序与其环境之间交互的方式&#xff0c;比书中之前所展示的更为复杂。本章我们会详描述标准库&#xff0c;即一系列为 C 程序提供输…