小C在玩一个回合制格斗游戏,她需要挑战boss。游戏的规则如下:
- 每回合小C先攻击boss,然后boss攻击小C。
- 小C有时能够闪避boss的攻击,成功闪避时她不会受到伤害。
- 小C的攻击会累积“连击点”,每次攻击时的伤害由公式 伤害=a+kb 计算,其中 a 是基础攻击力,b 是基础连击伤害,k 是连击次数。
- 每次攻击后,连击次数 k 增加 1。如果小C未能闪避boss的攻击,连击次数重置为0。
给定一场战斗的回合s,小C想知道她在这场战斗中对boss造成的总伤害是多少。在字符串s中,'1'代表本回合闪避成功,'0'代表闪避失败。
测试样例
样例1:
输入:
n = 3, a = 5, b = 2, s = "101"
输出:17
样例2:
输入:
n = 5, a = 6, b = 3, s = "11010"
输出:42
样例3:
输入:
n = 4, a = 4, b = 1, s = "0011"
输出:17
解题思路
问题理解
首先,我们需要理解游戏的规则和题目要求:
- 回合制战斗:每回合小C先攻击,然后boss攻击。
- 闪避机制:小C有时能够闪避boss的攻击,成功闪避时不会受到伤害。
- 连击机制:小C的攻击会累积连击点,每次攻击的伤害由公式 伤害=a+kb 计算,其中 a 是基础攻击力,b 是基础连击伤害,k 是连击次数。
- 连击重置:如果小C未能闪避boss的攻击,连击次数重置为0。
数据结构选择
为了实现这个问题的解决方案,我们可以使用以下数据结构:
- 整数变量:用于记录当前的连击次数
combo。 - 整数变量:用于累加总伤害
total_damage。
算法步骤
-
初始化:
- 初始化总伤害
total_damage为0。 - 初始化连击次数
combo为0。
- 初始化总伤害
-
遍历字符串
s:-
对于每个字符,计算当前攻击的伤害
damage,公式为a + combo * b。 -
将当前攻击的伤害累加到
total_damage中。 -
根据闪避情况更新连击次数:
- 如果字符是
'1',表示闪避成功,连击次数增加1。 - 如果字符是
'0',表示闪避失败,连击次数重置为0。
- 如果字符是
-
-
返回总伤害:
- 遍历完所有回合后,返回累加的总伤害
total_damage。
- 遍历完所有回合后,返回累加的总伤害
代码实现
def solution(n: int, a: int, b: int, s: str) -> int:
# 初始化总伤害和连击次数
total_damage = 0
combo = 0
# 遍历字符串 s 中的每个字符
for char in s:
# 计算当前攻击的伤害
damage = a + combo * b
# 累加总伤害
total_damage += damage
# 根据闪避情况更新连击次数
if char == '1':
# 闪避成功,连击次数增加
combo += 1
else:
# 闪避失败,连击次数重置
combo = 0
# 返回总伤害
return total_damage
代码解释
-
初始化:
total_damage初始化为0,用于累加小C对boss造成的总伤害。combo初始化为0,用于记录当前的连击次数。
-
遍历字符串
s:- 使用
for循环遍历字符串s中的每个字符。 - 对于每个字符,计算当前攻击的伤害
damage,公式为a + combo * b。 - 将当前攻击的伤害累加到
total_damage中。
- 使用
-
根据闪避情况更新连击次数:
- 如果字符是
'1',表示闪避成功,连击次数增加1。 - 如果字符是
'0',表示闪避失败,连击次数重置为0。
- 如果字符是
-
返回总伤害:
- 遍历完所有回合后,返回累加的总伤害
total_damage。
- 遍历完所有回合后,返回累加的总伤害
测试样例
在 if __name__ == '__main__': 部分,我们添加了一些测试样例来验证代码的正确性:
solution(3, 5, 2, "101") == 17solution(5, 6, 3, "11010") == 42solution(4, 4, 1, "0011") == 17
总结
通过遍历字符串 s,我们可以根据每个回合的闪避情况更新连击次数,并计算每次攻击的伤害,最终累加得到总伤害。这个问题的关键在于理解连击机制和闪避机制,并通过遍历字符串来模拟每回合的战斗过程。