- 题目:
小U最近沉迷于一款养成类游戏,游戏中的角色拥有三项属性:体力、智力和武力,初始值均为0。随着每天的游戏进展,这些属性会逐步增加。增加情况由一个二维数组 growup 表示,每个元素是一个长度为3的一维数组,分别表示每天的体力、智力和武力增加值。例如,[[1, 1, 2], [2, 2, 1], [2, 1, 2]] 表示第一天体力增加1,智力增加1,武力增加2,第二天分别增加2,2,1,第三天分别增加2,1,2。
在游戏中,玩家可以通过学习新技能来增强角色,但前提是角色的三项属性必须达到技能学习的要求。每个技能的学习要求也用一个二维数组 skill 表示,数组中的每个元素是一个长度为3的一维数组,分别表示学习某个技能所需的最低体力、智力和武力值。
任务是根据 growup 和 skill 数组,计算出玩家在多少天内可以学习每个技能。如果无法满足某个技能的学习要求,则返回 -1。
- 解题思路:
- 首先,我们需要明确目标是根据每天属性的增长情况(由 growup 数组表示)以及每个技能的学习要求(由 skill 数组表示),来确定玩家在多少天内可以学习每个技能。如果无法满足学习要求,则返回 -1。
- 对于每个技能,我们需要从第一天开始,逐步累加每天的属性增加值,同时检查是否满足该技能的学习要求。
- 具体步骤如下:
-
遍历 skill 数组中的每个技能要求。
-
对于每个技能要求,再遍历 growup 数组中的每一天,累加当天的体力、智力和武力增加值到对应的属性变量上。
-
在每次累加后,检查当前的体力、智力和武力值是否满足该技能的学习要求。如果满足,记录下当前的天数并结束对该技能的检查;如果一直到遍历完所有天数都不满足,则返回 -1。
-
示例图示(以简单示例说明计算过程):
假设 growup = [[1, 1, 1], [2, 2, 2], [3, 3, 3]] ,表示三天内每天的体力、智力和武力增加值。
假设 skill = [[3, 3, 3], [5, 5, 5]] ,表示有两个技能,第一个技能要求体力、智力和武力值至少达到3,第二个技能要求至少达到5。
-
对于第一个技能:
-
第一天:初始属性均为0,累加第一天的增加值后,体力 = 1,智力 = 1,武力 = 1。不满足技能要求。
-
第二天:在第一天的基础上,累加第二天的增加值,体力 = 1 + 2 = 3,智力 = 1 + 2 = 3,武力 = 1 + 2 = 3。此时满足第一个技能的学习要求,记录天数为2。
-
对于第二个技能:
-
第一天:同上述过程,第一天结束后属性值未满足要求。
-
第二天:属性值累加后也未满足要求。
-
第三天:在第二天的基础上,累加第三天的增加值,体力 = 3 + 3 = 6,智力 = 3 + 3 = 6,武力 = 3 + 3 = 6。此时满足第二个技能的学习要求,记录天数为3。
Python代码如下:
`def days_to_learn_skills(growup, skill): result = [] for skill_req in skill: days = 0 current_strength = 0 current_intelligence = 0 current_force = 0
for day_growth in growup:
days += 1
current_strength += day_growth[0]
current_intelligence += day_growth[1]
current_force += day_growth[2]
if (current_strength >= skill_req[0] and
current_intelligence >= skill_req[1] and
current_force >= skill_req[2]):
result.append(days)
break
else:
result.append(-1)
return result`
代码详解:
- days_to_learn_skills 函数接受两个参数: growup 是一个二维数组,表示每天的体力、智力和武力增加值; skill 也是一个二维数组,表示每个技能的学习要求。函数返回一个列表,列表中的每个元素对应每个技能在多少天内可以学习,如果无法学习则为 -1。
- 首先,创建一个空列表 result ,用于存储每个技能可以学习的天数结果。
- 然后,通过一个外循环遍历 skill 中的每个技能要求 skill_req 。
- 对于每个技能要求,初始化以下几个变量:
- days :用于记录当前检查技能时已经经过的天数,初始值为0。
- current_strength 、 current_intelligence 、 current_force :分别用于记录当前的体力、智力和武力值,初始值均为0。
- 接着,通过一个内循环遍历 growup 中的每一天 day_growth 。
- 每次循环,先将 days 加1,表示经过了一天。
- 然后分别累加当天的体力、智力和武力增加值到对应的属性变量上,即 current_strength 加上 day_growth[0] , current_intelligence 加上 day_growth[1] , current_force 加上 day_growth[2] 。
- 在每次累加后,通过一个条件判断来检查当前的体力、智力和武力值是否满足该技能的学习要求。如果满足(即 current_strength 大于等于 skill_req[0] , current_intelligence 大于等于 skill_req[1] , current_force 大于等于 skill_req[2] ),则将当前的 days 值添加到 result 列表中,并通过 break 语句结束对该技能的内循环检查。
- 如果在内循环遍历完所有的 growup 天数后,都没有满足技能要求的情况,那么就执行 else 语句,将 -1 添加到 result 列表中。
- 最后,当外循环遍历完所有的 skill 技能要求后,函数返回 result 列表,其中包含了每个技能在多少天内可以学习或者 -1 表示无法学习的结果。