[M贪心] lcLCP30. 魔塔游戏(STL优先队列+堆+贪心)

1. 题目来源

链接:LCP 30. 魔塔游戏

2. 题目解析

挺不错的一道贪心问题。

思路:

  • 首先顺序累加所有怪物血量,在血量初始值为 1 时,若累加完毕, s u m ≤ 0 sum \le0 sum0 则说明怎么调整也是无法保证走完所有房间且血量符合要求的。返回 -1 即可。反之,一定可以通过调整走完所有房间,大不了就将所有的负数全部放到最后,就可以了。
  • 但是如何保证调整次数最少呢?一定不能见到一个负数就操作一次吧。
  • 贪心调整思路如下:
    • 每次在我们血量 b l o o d ≤ 0 blood \le 0 blood0 的时我们进行调整。调整时,将之前我们遇到的对我们伤害最大的怪物放到最后。即负数最小的,也就是负数中绝对值最大的怪物放到最后。因为之前遇到过,血量已经被他扣了,在调整时,要将之前被这个怪物扣的血量补充回来。直到依次将扣血最大的怪物向后调整,补充血量到 > 0 \gt0 >0 后,再依次向后走。
    • 血量初始为 1 ,为题目要求。顺序遍历怪物,记录遇到的负血量的怪物,由于需要动态的记录这些负血量怪物的最大值,所以需要使用优先队列。
    • 每遇到一个怪物,不论血量正负,都和当前的血量 b l o o d blood blood 进行累加。且记录负血量怪物进小顶堆,在此使用技巧,负值可以添加负号变为正值,然后放入大顶堆,达到和小顶堆同样的效果。注意出堆时,需要再补充回一个负号。
    • b l o o d ≤ 0 blood\le0 blood0 时,一定是之前遇到了负血量怪物,那么就要将堆中这些负血量怪物,按照扣出血量大小依次出堆,补充给 b l o o d blood blood,直到将 b l o o d blood blood 补充回 > 0 \gt0 >0 的状态。然后就不必再调整了。
    • 在此,直接取堆顶元素补充给血量即可,然后直接将堆顶元素出堆,不需要再保留该怪物的血量作记录。因为一定可以经过调整遍历完所有怪物房间,且只会有负血量怪物调整到末尾。所以,我们在血量见底时,假装的没遍历,调整后血量补充,等价于跳过这个扣血最大的怪物,将其放到最后。那么,遍历完之后我们剩余的血量 b l o o d blood blood,也是一定可以将最后这些调整的连续负血量怪物遍历完的。最后只需要返回最小的调整次数即可,剩余血量,就是一开始累加的 s u m sum sum

总结如下:

  • 一开始累加所有怪物血量,若 ≤ 0 \le0 0,则返回 -1,无法调整。
  • 反之,一定可以调整。顺序遍历所有怪物,累加血量 b l o o d blood blood,并将负血量怪物记录进优先队列,用以动态计算扣血最大的负血量怪物。当血量 b l o o d ≤ 0 blood\le0 blood0,则从堆中依次弹出之前遇到的扣血最大的怪物用以回血。这样一来,之前扣的血,现在再加上,等价于没遍历这个怪物,等价于将其调整到最后,则调整次数 +1。
  • 当遍历到数组末尾时,该末尾后面全是调整过来的负血量怪物,已经不需在此调整。一定保证当前剩余血量可以遍历完这些连续的负血量怪物,故直接返回调整次数即可。

注意开 LL


  • 时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
  • 空间复杂度 O ( n ) O(n) O(n)

代码:

class Solution {
public:
    int magicTower(vector<int>& nums) {
        typedef long long LL;
        
        LL sum = 1;
        for (int x : nums) sum += x;
        if (sum <= 0) return -1;
        
        LL blood = 1, res = 0;
        priority_queue<int> q;
        for (int x : nums) {
            if (x < 0) q.push(-x);
            blood += x;
            while (blood <= 0) {
                blood += q.top(); q.pop();
                res ++ ;
            }
        }

        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: CocosCreator是一款功能强大的游戏开发引擎,而魔塔游戏源码则是指使用CocosCreator开发的一款魔塔游戏的源代码。 CocosCreator魔塔游戏源码通常包含游戏的各个模块,包括角色控制、战斗系统、地图生成以及游戏UI等。在这个源码中,开发者可以看到一套完整的魔塔游戏框架和逻辑。 角色控制是魔塔游戏源码中的重要部分。开发者可以看到玩家角色的移动、攻击以及技能释放等代码。通过阅读源码,开发者可以了解到游戏角色的行为逻辑,比如怪物移动的规则、装备系统的实现等。 另外,战斗系统是魔塔游戏源码中的关键内容。开发者可以通过查看源码,了解到游戏的攻击和防御计算方式、技能释放和效果表现等细节。这对于学习游戏战斗系统的设计与实现非常有帮助。 地图生成也是源码中的一个重要模块。通过阅读源码,开发者可以了解到地图生成的算法、随机事件的处理、宝箱、商店等游戏元素的放置和生成等细节。 游戏的UI设计也是魔塔游戏源码中不可缺少的一部分。开发者可以通过查看源码,了解到游戏UI的布局、按钮点击事件的处理、弹窗的实现等细节。 总之,通过研究CocosCreator魔塔游戏源码,开发者可以学习到游戏开发中常用的算法和设计思路,同时也可以培养自己的开发能力和创造力。在学习和借鉴源码的基础上,开发者还可以根据自身需求进行二次开发和优化,创作出属于自己的魔塔游戏作品。 ### 回答2: CocosCreator魔塔游戏源码是指使用CocosCreator开发的魔塔游戏的程序代码。CocosCreator是一款基于Javascript的游戏开发引擎,通过它可以轻松创建多平台的游戏魔塔游戏源码通常包含了游戏的一些基本组成部分,如场景、角色、道具、怪物等。它们通过CocosCreator的节点和组件系统进行组织和管理。在源码中,开发者可以了解到游戏的逻辑、界面设计以及各个功能模块的实现方式。 通过使用CocosCreator魔塔游戏源码,开发者可以学习到如何实现一个完整的魔塔游戏。他们可以了解到游戏场景的搭建,通过编辑器创建地图和设置场景元素。他们可以学习到如何处理游戏角色的移动、攻击和受伤等操作,并实现相应的动画效果。另外,他们还可以了解到如何处理游戏道具的使用和怪物的生成与AI行为等。 魔塔游戏源码可以帮助开发者迅速上手游戏开发,节省大量的开发时间。通过对源码的学习和理解,开发者可以根据自己的需要进行二次开发和扩展,实现独具创意的魔塔游戏。 ### 回答3: CocosCreator魔塔游戏源码是基于CocosCreator游戏引擎开发的一种魔塔游戏的代码。魔塔游戏是一种以策略和冒险为主题的角色扮演游戏,玩家需要在迷宫中探索、寻找宝物、打败敌人,最终达到最深层并击败最终BOSS。 CocosCreator魔塔游戏源码包含了游戏的基本逻辑、界面设计、角色控制、敌人AI、道具系统等各个方面的代码实现。通过阅读源码,我们可以了解到游戏是如何实现地图的生成与呈现、角色的移动和战斗、敌人的行为规则、道具的获取和使用等功能。同时,源码还提供了一些基本的游戏美术资源,如角色、地图瓷砖、敌人等,可以用于快速搭建游戏。 在实际使用源码的时候,我们可以根据自己的需求进行修改和扩展,比如添加新的关卡、设计新的敌人、增加新的道具等。同时,我们也可以根据源码学习到CocosCreator游戏开发的一些基本技巧与规范,例如场景管理、碰撞检测、UI设计等。 总之,CocosCreator魔塔游戏源码是一个可以让我们了解和学习魔塔游戏开发的实际案例,可以通过对源码的学习和修改,快速搭建自己的游戏项目,并且还可以帮助我们掌握CocosCreator游戏引擎的使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值