问题描述
小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
。
测试样例
样例1:
输入:
m = 3, n = 3, arrayM = [[1, 3, 3], [2, 5, 6], [3, 3, 1]], arrayN = [[1, 1, 1], [4, 5, 5], [7, 7, 7]]
输出:[1, 3, -1]
样例2:
输入:
m = 2, n = 2, arrayM = [[2, 4, 1], [3, 1, 2]], arrayN = [[3, 5, 2], [7, 7, 7]]
输出:[2, -1]
样例3:
输入:
m = 2, n = 3, arrayM = [[2, 4, 1], [3, 1, 2]], arrayN = [[3, 5, 2], [7, 7, 7], [4, 4, 4]]
输出:[2, -1,-1]
C++实现
问题理解
- 初始状态:角色的体力、智力和武力初始值均为0。
- 每天的属性增加:每天的属性增加由二维数组
growup
表示,每个元素是一个长度为3的一维数组,分别表示每天的体力、智力和武力增加值。 - 技能学习要求:每个技能的学习要求由二维数组
skill
表示,数组中的每个元素是一个长度为3的一维数组,分别表示学习某个技能所需的最低体力、智力和武力值。 - 目标:计算出玩家在多少天内可以学习每个技能。如果无法满足某个技能的学习要求,则返回
-1
。
数据结构选择
- 属性状态:可以使用三个变量来记录当前的体力、智力和武力值。
- 技能学习状态:可以使用一个数组来记录每个技能的学习天数,初始值为
-1
。
算法步骤
-
初始化:
- 初始化当前的体力、智力和武力值为0。
- 初始化一个数组
days
来记录每个技能的学习天数,初始值为-1
。
-
模拟每天的属性增加:
- 遍历每一天的属性增加值,更新当前的体力、智力和武力值。
- 检查当前的属性值是否满足某个技能的学习要求。
- 如果满足,记录当前的天数到
days
数组中。
-
返回结果:
- 返回
days
数组作为结果。
- 返回
关键点
- 属性更新:每天更新属性值时,需要累加当天的增加值。
- 技能检查:每次更新属性值后,检查是否满足某个技能的学习要求。
- 边界条件:如果某个技能的要求永远无法满足,返回
-1
。
代码实现
#include <iostream>
#include <vector>
std::vector<int> solution(int m, int n, std::vector<std::vector<int>> arrayM, std::vector<std::vector<int>> arrayN) {
// 初始化当前的体力、智力和武力值
int current_strength = 0, current_intelligence = 0, current_agility = 0;
std::vector<int> result(n, -1); // 初始化结果数组,默认值为-1
// 遍历每一天的属性增加
for (int day = 0; day < m; ++day) {
current_strength += arrayM[day][0];
current_intelligence += arrayM[day][1];
current_agility += arrayM[day][2];
// 检查是否满足某个技能的学习条件
for (int skill_index = 0; skill_index < n; ++skill_index) {
if (result[skill_index] == -1 &&
current_strength >= arrayN[skill_index][0] &&
current_intelligence >= arrayN[skill_index][1] &&
current_agility >= arrayN[skill_index][2]) {
result[skill_index] = day + 1; // 记录当前的天数
}
}
}
return result;
}
int main() {
// Add your test cases here
std::vector<std::vector<int>> arrayM = {{1, 3, 3}, {2, 5, 6}, {3, 3, 1}};
std::vector<std::vector<int>> arrayN = {{1, 1, 1}, {4, 5, 5}, {7, 7, 7}};
std::vector<int> result = solution(3, 3, arrayM, arrayN);
std::cout << (result == std::vector<int>{1, 3, -1}) << std::endl;
return 0;
}
Python实现
思路说明
题目要求根据每天的属性增长情况,计算出每个技能在多少天内可以学习。核心信息是每天的属性增长和每个技能的学习要求。我们可以通过模拟每一天的属性增长,并检查是否满足某个技能的学习要求来解决问题。具体来说,我们维护一个当前属性数组,每天根据 growup
数组更新属性,然后检查每个技能是否满足学习条件,记录满足条件的天数。
解题过程
- 初始化当前属性:创建一个长度为3的数组
current_attributes
,初始值为[0, 0, 0]
,表示初始的体力、智力和武力值。 - 初始化结果数组:创建一个长度为
n
的数组result
,初始值为-1
,表示所有技能的初始学习天数为-1
。 - 模拟每一天的属性增长:
- 遍历每一天的属性增长数组
arrayM
,更新current_attributes
。 - 对于每一天,检查所有未学习的技能(即
result
中值为-1
的技能),判断当前属性是否满足该技能的学习要求。 - 如果满足,则将该技能的学习天数记录在
result
中。
- 遍历每一天的属性增长数组
- 返回结果:最终返回
result
数组,其中每个元素表示对应技能的学习天数,如果无法学习则保持-1
。
复杂度分析
- 时间复杂度:O(m×n),其中 m 是天数,n 是技能数。我们需要遍历每一天的属性增长,并在每一天检查所有技能的学习条件。
- 空间复杂度:O(n),我们使用了一个长度为
n
的结果数组result
来存储每个技能的学习天数。
知识点扩展
- 数组操作:题目中使用了数组来存储和更新属性值,以及记录技能的学习天数。数组是一种基本的数据结构,能够高效地存储和访问数据。
- 循环控制结构:通过嵌套的
for
循环,我们模拟了每一天的属性增长,并检查了每个技能的学习条件。循环控制结构是编程中常用的逻辑控制手段。 - 条件判断:在每一天的属性更新后,我们使用条件判断来检查是否满足技能的学习要求,这是解决问题的关键步骤之一。
代码实现
def solution(m, n, arrayM, arrayN):
current_attributes = [0, 0, 0]
result = [-1] * n # 初始化结果数组,默认值为-1
for day in range(m):
# 更新当前属性
for i in range(3):
current_attributes[i] += arrayM[day][i]
# 检查是否满足技能学习要求
for skill_index in range(n):
if result[skill_index] == -1: # 只检查未学习的技能
required_attributes = arrayN[skill_index]
if all(current_attributes[i] >= required_attributes[i] for i in range(3)):
result[skill_index] = day + 1 # 记录学习天数
return result
if __name__ == "__main__":
# Add your test cases here
print(
solution(
3, 3, [[1, 3, 3], [2, 5, 6], [3, 3, 1]], [[1, 1, 1], [4, 5, 5], [7, 7, 7]]
)
== [1, 3, -1]
)