Leetcode Link: 6152. 赢得比赛需要的最少训练时长 - 力扣(LeetCode)

题目

解法一

个人思路

  • 求所需的精力 这个好求,我们只需要保证我们的初始精力比所有总需要的精力大 1 即可。 need_energy = sum(energy) - initialEnergy + 1

  • 求所需经验 因为经验是累加的,因此不能像求精力那样直接从和入手。 经验需要逐位累加,逐位考虑,每次累加到对应的位置,一旦小于目标经验,则需要训练对应的时间。

题解

class Solution:
    def minNumberOfHours(self, initialEnergy: int, initialExperience: int, energy: List[int], experience: List[int]) -> int:
        # 所需精力
        need_energy = max(sum(energy)-initialEnergy+1, 0)
		# 所需经验
        actual_exp = [0] * len(experience)
        actual_exp[0] = initialExperience
        need_exp = 0
        
        for i in range(len(experience)-1):
	        # 当实际经验小于等于所需经验的时候
	        # 需要锻炼对应的时间,把实际经验顶到所需经验+1的位置
            if actual_exp[i] <= experience[i]:
                need_exp += experience[i] - actual_exp[i] + 1
                actual_exp[i] = experience[i] + 1
            actual_exp[i+1] = actual_exp[i] + experience[i]
		# 最后一个关卡的经验没有被判断,这里补上
        if actual_exp[-1] <= experience[-1]:
            need_exp += experience[-1] - actual_exp[-1] + 1
        
        return need_exp + need_energy

解法二

思路

题解

启发和联系

错误分析

忘记判断变量的正负性,导致输出可能为负数。