青训题目学习技能计算线上报警分类

46 阅读5分钟

AB 实验作为推荐策略迭代的有力工具,经常会有新的实验上线,以及一些无效策略的下线。在这些迭代过程中,难免会遇到意料之外的情况,导致部分服务崩溃而不可用。为了避免系统的全面崩溃,工程师们会添加监控报警,确保第一时间通知到值班同学进行处理。

小M同学刚刚开始负责线上报警的值班工作。很快,她就收到了第一条报警日志。在报警的时间范围内,小M同学收到了 NN 名用户的反馈,每位用户编号为 11 到 NN。小M同学查询线上实验后,统计了用户命中实验的列表,其中第 ii 位用户命中了 kiki​ 个实验,第 jj 个实验的编号为 ai,jai,j​。

这些用户的反馈并不完全是由于一个问题造成的,因此小M同学需要对这些问题进行分类。根据先前的经验,小M同学会进行 QQ 次询问尝试对问题进行分类,第 ii 次询问会给出一个序列 bi,1,bi,2,…,bi,cibi,1​,bi,2​,…,bi,ci​​,cici​ 表示第 ii 次查询的实验数量。当 bi,j>0bi,j​>0 时表示命中实验 ∣bi,j∣∣bi,j​∣,否则表示未命中实验 ∣bi,j∣∣bi,j​∣。小M同学需要得到符合这些条件的用户数。例如,序列 1, -2, 3 表示命中实验 1, 3 且未命中实验 2 的用户数量。

小M同学初来乍到,希望你能帮她解决这个问题。


测试样例

样例1:

输入:n = 3, m = 3, q = 3, arrayN = [[2, 1, 2], [2, 2, 3], [2, 1, 3]], arrayQ = [[2, 1, -2], [2, 2, -3], [2, 3, -1]]
输出:[1, 1, 1]

样例2:

输入:n = 5, m = 4, q = 2, arrayN = [[3, 1, 2, 3], [1, 2], [2, 1, 4], [3, 2, 3, 4], [2, 1, 3]], arrayQ = [[3, 1, -4, 2], [2, -1, -3]]
输出:[1, 1]

样例3:

输入:n = 4, m = 3, q = 2, arrayN = [[1, 1], [2, 2, 3], [1, 3], [2, 1, 2]], arrayQ = [[1, -3], [2, 2, 3]]
输出:[2, 1]

  1. 数据结构

    • 我们需要一个列表 experiments,其中每个用户的实验信息以集合的形式存储,这样可以方便地进行查找和比较。
    • 当查询条件给出时,我们可以通过集合操作来验证用户是否满足条件。
  2. 处理查询

    • 每次查询时,我们会检查每个用户命中和未命中的实验,根据实验的正负号处理相应的集合查询。
    • 对于命中实验,我们查看用户实验集合是否包含该实验;对于未命中实验,我们检查该实验是否不在用户实验集合中。
  3. 计数符合条件的用户

    • 对每个查询,统计符合条件的用户数量,并将结果存储在一个列表中,最终返回这个列表。

小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]

def solution(m, n, arrayM, arrayN):
    # 初始化属性列表
    attributes = [[0, 0, 0]]  # 第0天的属性
    current_attr = [0, 0, 0]
    
    # 计算每天的属性增长
    for grow in arrayM:
        current_attr[0] += grow[0]  # 体力
        current_attr[1] += grow[1]  # 智力
        current_attr[2] += grow[2]  # 武力
        attributes.append(current_attr[:])  # 将今天的属性添加到列表
    
    results = []
    
    # 判断每个技能的学习时间
    for skill in arrayN:
        day_found = -1
        
        for day in range(len(attributes)):
            if (attributes[day][0] >= skill[0] and 
                attributes[day][1] >= skill[1] and 
                attributes[day][2] >= skill[2]):
                day_found = day
                break
        
        results.append(day_found)
    
    return results

if __name__ == "__main__":
    # 测试用例
    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]
    )
    
    print(
        solution(
            2, 2, [[2, 4, 1], [3, 1, 2]], [[3, 5, 2], [7, 7, 7]]
        )
        == [2, -1]
    )
    
    print(
        solution(
            2, 3, [[2, 4, 1], [3, 1, 2]], [[3, 5, 2], [7, 7, 7], [4, 4, 4]]
        )
        == [2, -1, -1]
    )

  1. 跟踪属性增长

    • 使用一个列表 attributes 来记录玩家每天截至当前的体力、智力和武力。游戏初始属性为 [0, 0, 0]。
    • 遍历每天的增长值,会逐步累加到这个属性列表中。
  2. 技能学习要求

    • 对于每个技能的要求,进行判断:

      • 从游戏第一天开始逐日比较玩家的属性与技能的学习要求。
      • 如果某一天的属性满足所有技能的要求,记录该天数。
      • 如果遍历完所有天数,仍旧未满足要求,则返回 -1。
  3. 返回结果

    • 收集每个技能的学习天数,输出结果。