JZX轻语:简

LeetCode 3207 - 与敌人战斗后的最大分数

发表于2024年08月10日

#排序 #贪心 #队列

需要仔细理解题意:需要分数至少为1的时候才能使用操作2(并不是能量至少为1…)!因为无论敌人能量如何,战胜敌人的分数都为1分。因此可以使用贪心法解决:首先对敌人的能量进行排序,然后每次选择能量最小的敌人进行战斗,直到自己的能量不足以战斗为止。这样可以保证每次战斗的分数最大。如果自己的能量不足以继续战斗,那么就选择能量最大的敌人进行标记,以获得尽可能多的能量。可以使用队列解决,也可以使用双指针解决。

注:后面发现想多了…其实可以简化为这样:先标记完除了能量最小的敌人外的所有敌人,然后再疯狂战斗能量最小的敌人。

class Solution:
    def maximumPoints(self, enemyEnergies: List[int], currentEnergy: int) -> int:
        q = deque(sorted(enemyEnergies))
        ans = 0
        while q:
            if currentEnergy >= q[0]:
                battled = currentEnergy // q[0]
                ans += battled
                currentEnergy -= battled * q[0]
            else:
                if ans == 0:
                    break
                currentEnergy += q.pop()
        return ans

双指针解法:

class Solution:
    def maximumPoints(self, enemyEnergies: List[int], currentEnergy: int) -> int:
        enemyEnergies.sort()
        next_mark = len(enemyEnergies) - 1
        ans = 0
        while next_mark >= 0:
            if currentEnergy >= enemyEnergies[0]:
                battled = currentEnergy // enemyEnergies[0]
                ans += battled
                currentEnergy -= battled * enemyEnergies[0]
            else:
                if ans == 0:
                    break
                currentEnergy += enemyEnergies[next_mark]
                next_mark -= 1
        return ans

更简单的做法

class Solution:
    def maximumPoints(self, enemyEnergies: List[int], currentEnergy: int) -> int:
        min_enemy = min(enemyEnergies)
        if currentEnergy < min_enemy:
            return 0
        return (currentEnergy + sum(enemyEnergies) - min_enemy) // min_enemy

闪念标签:LC

题目链接:https://leetcode.cn/problems/maximum-points-after-enemy-battles/