C. 小红打怪 (python解)-牛客

C. 小红打怪 (python解)-牛客

原题链接:

C. 小红打怪

问题分析:

  • 小红的全体打击技能对所有怪物造成1点伤害。
  • 队友1的单体打击技能可以对任意单个怪物造成1点伤害。
  • 队友2的范围攻击技能可以对相邻的两只怪物分别造成1点伤害(可对已死亡的怪物使用)。

思路:

  • 设定一个函数 check(mx) 用来验证在 mx 次攻击下,是否可以击杀所有怪物。
  • 首先使用小红的技能,在每个回合中每个怪物的生命值减少 mx
  • 使用队友的技能来补充对生命值仍然大于零的怪物的攻击。
  • 我们可以使用二分法来寻找能够击杀所有怪物的最小回合数。即在 010^14 之间进行查找。
  • 通过 check(mx) 函数判断当前回合数是否足够。
  • 直接计算每个技能的应用结果,避免不必要的数组复制,提高效率。

代码:

def main():  
    n = int(input())  
    a = list(map(int, input().split()))  
    def check(mx):  
        k1, k2 = mx, mx   # 小红和队友2的技能可用次数  
        hp = a.copy()  # 剩余血量  
        # 小红攻击  
        for i in range(n):  
            hp[i] = max(0, hp[i] - mx)  
        # 队友2的范围攻击  
        for i in range(n - 1):  
            if hp[i] > 0 and hp[i + 1] > 0:  
                t = min(hp[i], hp[i + 1], k2)  
                k2 -= t  
                hp[i] -= t  
                hp[i + 1] -= t  
        # 验证剩余血量是否可以用队友1的单体攻击击杀  
        return sum(hp) <= k1 + k2  
    left, right = 0, 10 ** 14  
    while left + 1 < right:  
        mid = (left + right) // 2  
        if check(mid):  
            right = mid  
        else:  
            left = mid  
    return right  
print(main())
posted @ 2024-11-10 18:11  MPyGF  阅读(22)  评论(0编辑  收藏  举报