1. 解题思路
这一题代码并不复杂,关键就是想明白为啥。
我直接的一个思路就是贪婪算法,考察任意两个怪 i , j i, j i,j之间处理的先后关系,其结果为:
- 先处理
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 - 先处理
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。