Leetcode 3273. Minimum Amount of Damage Dealt to Bob

1. 解题思路

这一题代码并不复杂,关键就是想明白为啥。

我直接的一个思路就是贪婪算法,考察任意两个怪 i , j i, j i,j之间处理的先后关系,其结果为:

  1. 先处理 i i i时受到的伤害:
    T i = t i × d i + ( t i + t j ) × d j + T o t h e r T_i = t_i \times d_i + (t_i + t_j) \times d_j + T_{other} Ti=ti×di+(ti+tj)×dj+Tother
  2. 先处理 j j j时受到的伤害:
    T j = t j × d j + ( t i + t j ) × d i + T o t h e r T_j = t_j \times d_j + (t_i + t_j) \times d_i + T_{other} Tj=tj×dj+(ti+tj)×di+Tother

要满足 T i < T j T_i < T_j Ti<Tj,则有:
t i × d j < t j × d i t_i \times d_j < t_j \times d_i ti×dj<tj×di

亦即:
d i t i > d j d i \frac{d_i}{t_i} > \frac{d_j}{d_i} tidi>didj

因此,我们按照怪的伤害与干掉怪所需的时间的比值进行排序,从高到低依次干掉所有的怪即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def minDamage(self, power: int, damage: List[int], health: List[int]) -> int:
        s = sum(damage)
        enemies = [(d, math.ceil(h/power)) for d, h in zip(damage, health)]
        enemies = sorted(enemies, key=lambda x: x[0]/x[1], reverse=True)
        
        ans = 0
        for ds, dt in enemies:
            ans += s * dt
            s -= ds
        return ans

提交代码评测得到:耗时946ms,占用内存40.2MB。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值