学习技能时间计算

问题描述

        小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++实现

问题理解

  1. 初始状态:角色的体力、智力和武力初始值均为0。
  2. 每天的属性增加:每天的属性增加由二维数组 growup 表示,每个元素是一个长度为3的一维数组,分别表示每天的体力、智力和武力增加值。
  3. 技能学习要求:每个技能的学习要求由二维数组 skill 表示,数组中的每个元素是一个长度为3的一维数组,分别表示学习某个技能所需的最低体力、智力和武力值。
  4. 目标:计算出玩家在多少天内可以学习每个技能。如果无法满足某个技能的学习要求,则返回 -1

数据结构选择

  • 属性状态:可以使用三个变量来记录当前的体力、智力和武力值。
  • 技能学习状态:可以使用一个数组来记录每个技能的学习天数,初始值为 -1

算法步骤

  1. 初始化

    • 初始化当前的体力、智力和武力值为0。
    • 初始化一个数组 days 来记录每个技能的学习天数,初始值为 -1
  2. 模拟每天的属性增加

    • 遍历每一天的属性增加值,更新当前的体力、智力和武力值。
    • 检查当前的属性值是否满足某个技能的学习要求。
    • 如果满足,记录当前的天数到 days 数组中。
  3. 返回结果

    • 返回 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 数组更新属性,然后检查每个技能是否满足学习条件,记录满足条件的天数。

解题过程

  1. 初始化当前属性:创建一个长度为3的数组 current_attributes,初始值为 [0, 0, 0],表示初始的体力、智力和武力值。
  2. 初始化结果数组:创建一个长度为 n 的数组 result,初始值为 -1,表示所有技能的初始学习天数为 -1
  3. 模拟每一天的属性增长
    • 遍历每一天的属性增长数组 arrayM,更新 current_attributes
    • 对于每一天,检查所有未学习的技能(即 result 中值为 -1 的技能),判断当前属性是否满足该技能的学习要求。
    • 如果满足,则将该技能的学习天数记录在 result 中。
  4. 返回结果:最终返回 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]
    )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值