1. 解题思路
这一题是Leetcode周赛479的第三题,是一道medium的题目。
这一题的话主要是一些数学分析,我们考察第 i i i个位置一共可以贡献多少score。假设某一个位置 j j j( j ≤ i j \leq i j≤i)开始的score当中位置 i i i贡献了score,那必然有:
r i ≤ h p − ∑ k = j i d k = h p − s i + s j r_i \leq hp - \sum\limits_{k=j}^{i}d_k = hp - s_{i} + s_{j} ri≤hp−k=j∑idk=hp−si+sj
亦即:
r i + s i − h p ≤ s j r_i+s_i-hp \leq s_j ri+si−hp≤sj
其中, s i s_i si表示damage到第 i i i个位置的前序和。
因此,我们只需要计算出第 i i i个位置的 r i + s i − h p r_i+s_i-hp ri+si−hp的值,然后数一下其前序和之中有多少个值大于这个值即为对应位置一共可以获取的score的值。
2. 代码实现
给出python代码实现如下:
class Solution:
def totalScore(self, hp: int, damage: List[int], requirement: List[int]) -> int:
accum_damage = list(accumulate(damage))
prefix = [0]
ans = 0
for accum_dmg, req in zip(accum_damage, requirement):
s = req + accum_dmg - hp
idx = bisect.bisect_left(prefix, s)
ans += len(prefix) - idx
prefix.append(accum_dmg)
return ans
提交代码评测得到:耗时251ms,占用内存34.66MB。
1万+

被折叠的 条评论
为什么被折叠?



