最大战力值题解 | 豆包MarsCode AI刷题

49 阅读3分钟

题目地址:最大战力值

问题描述

小F正在设计一款手游,游戏中的角色战力值需要根据一定规则来平衡,以提升玩家的游戏体验。现在游戏中有 n 个角色,编号从 0 到 n-1。为了保证平衡性,角色战力值需要遵循以下规则:

  1. 编号为 0 的角色战力值初始为 0
  2. 每个角色的战力值必须是非负整数。
  3. 相邻角色的战力值差不能超过 1,即两个相邻角色的战力值差可以是 0+1 或 -1

除此之外,游戏策划还为某些角色设定了最大战力值。这些限制通过若干数对给出,每一个数对 limit[i] = [index, maxPower],表示编号为 index 的角色的战力值不能超过 maxPower。这些限定只会对编号不为 0 的角色生效。

你的任务是根据上述规则和限制,计算游戏中单个角色能达到的最大战力值。

输入:n = 3 ,m = 2 ,limit = [[1, 3], [2, 2]]
输出:2

输入:n = 5 ,m = 3 ,limit = [[1, 1], [2, 3], [4, 3]]
输出:3

输入:n = 4 ,m = 1 ,limit = [[2, 2]]
输出:3

题目思路

先抛开一切修饰语句
我们可以得出,输入n代表角色数量,编号则是0-(n-1);
然后m代表角色中已经设计好的数量;
limit则是m的每个个体代表的编号和最大战力;
首先,根据题目样例,我们先创建一个power数组,来存放多维元素
将角色0的战力设置为0,其他默认
    power = [float('inf')] * n
    power[0] = 0 
接下来利用min函数,将每个受到限制的角色应用进power数组

for index, maxPower in limit:
        power[index] = min(power[index], maxPower)
 前向遍历数组 `power`,对于每个角色 `i`,更新其战力值为 `min(power[i], power[i - 1] + 1)`。
 反向遍历数组 `power`,对于每个角色 `i`,更新其战力值为 `min(power[i], power[i + 1] + 1)`。

    for i in range(1, n):
        power[i] = min(power[i], power[i - 1] + 1)
 
   
    for i in range(n - 2, -1, -1):
        power[i] = min(power[i], power[i + 1] + 1)
这里两边遍历目的是为了防止第一遍遍历时,忽略掉后边的限制,导致的错误
第二次逆序遍历,确保不会又i+1位过低

具体来说,我们进行了前向遍历,确保每个角色的战力值不超过前一个角色的战力值加 1。
但是,这可能导致某些角色的战力值被设置得过低,因为它们没有考虑到后一个角色的限制。

我们进行反向遍历,确保每个角色的战力值不超过后一个角色的战力值加 1。
这样做可以保证每个角色的战力值在考虑前后角色限制的情况下达到最优。

最后我们只需要找到power数组中最大值即可
利用max(power[1:])就可以
直接返回即可。

3a5d6dcf4186d8b9ac61035594e1291.jpg