Leetcode 3771. Total Score of Dungeon Runs

1. 解题思路

这一题是Leetcode周赛479的第三题,是一道medium的题目。

这一题的话主要是一些数学分析,我们考察第 i i i个位置一共可以贡献多少score。假设某一个位置 j j j j ≤ i j \leq i ji)开始的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} rihpk=jidk=hpsi+sj

亦即:

r i + s i − h p ≤ s j r_i+s_i-hp \leq s_j ri+sihpsj

其中, s i s_i si表示damage到第 i i i个位置的前序和。

因此,我们只需要计算出第 i i i个位置的 r i + s i − h p r_i+s_i-hp ri+sihp的值,然后数一下其前序和之中有多少个值大于这个值即为对应位置一共可以获取的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。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值