LC 3273. 对 Bob 造成的最少伤害

https://leetcode.cn/problems/minimum-amount-of-damage-dealt-to-bob/description/

这题直觉上是贪心算法,但是怎么贪心是个问题,我是这么考虑的。假设每个敌人都需要使用 `R[i]` 轮才能消灭,而每个敌人造成的伤害是 `D[i]` ,我们只考虑最开始的时候,先选择 `R[0] or R[1]`

如果先选择 `R[0]` 的话,那么总体伤害是 R[0](D[0]+D[1]+D[2]+...)+R[1](D[1]+D[2]+...)+F(R[2:],D[2:])

如果先选择 `R[1]` 的话,那么总体伤害是 R[1](D[0]+D[1]+D[2]+...)+R[0](D[1]+D[2]+...)+F(R[2:],D[2:])

所以如果希望第一个伤害小的话,那么需要满足 R[0]D[1]<R[1]D[0]=>R[0]/D[0]<R[1]/D[1]

所以排序的方式应该就是 R/D

class Solution:
    def minDamage(self, power: int, damage: List[int], health: List[int]) -> int:
        n = len(damage)
        idx = list(range(n))

        def f(x):
            r = (health[x] + power - 1) // power
            return r / damage[x]

        idx.sort(key=f)
        total = sum(damage)

        ans = 0
        for i in idx:
            r = (health[i] + power - 1) // power
            ans += r * total
            total -= damage[i]
        return ans