青训营笔记6 | 豆包MarsCode AI刷题

19 阅读4分钟

题目:小U的挂机游戏英雄历练问题

问题描述

小U在一款挂机游戏中拥有n个英雄。游戏中有一种历练升级机制,每天可以选择两个英雄进行历练,如果两位英雄的等级相同,则他们的等级都不会改变。如果英雄等级不同,那么等级较高的英雄会增加1级,而等级较低的英雄则保持不变。

小U希望至少有一个英雄能够达到2000000000000000级,他想知道有多少英雄有潜力通过历练达到这个等级。


输入与输出

  • 输入:两个参数,n表示英雄的数量,u是一个数组,包含每个英雄的初始等级。
  • 输出:一个整数,表示有潜力达到2000000000000000级的英雄数量。

测试样例

样例1:

输入n = 5 ,u = [1, 2, 3, 1, 2]
输出3

样例2:

输入n = 4 ,u = [100000, 100000, 100000, 100000]
输出0

样例3:

输入n = 6 ,u = [1, 1, 1, 2, 2, 2]
输出3

问题分析

  这个问题的关键在于理解历练机制如何影响英雄的等级提升,并计算出在给定的历练规则下,哪些英雄有可能达到目标等级。由于历练机制的特点,可以推断出,只有等级最高的英雄有可能达到目标等级,因为只有他们能够持续获得等级提升。

解决方案

  1. 排序:首先需要对英雄的等级进行排序,以便快速识别出等级最高的英雄群体。
  2. 计算最大等级:找出数组u中的最大值,这代表了所有英雄中最高的初始等级。
  3. 计算潜力英雄数量:计算出达到目标等级所需的等级差,即2000000000000000减去最大等级。然后,计算出在历练机制下,等级最高的英雄群体需要多少次历练才能达到目标等级。如果这个次数小于或等于英雄数量,那么这些英雄都有潜力达到目标等级。
  4. 输出结果:输出有潜力达到目标等级的英雄数量。

实现步骤

  1. 对数组u进行排序。
  2. 找出数组u中的最大值max_level
  3. 计算目标等级与最大等级的差值target_diff = 2000000000000000 - max_level
  4. 如果target_diff小于或等于0,说明最大等级已经达到或超过目标等级,输出n
  5. 否则,计算出达到目标等级所需的历练次数历练次数 = target_diff
  6. 如果历练次数小于或等于n,输出n - u.count(max_level) + 1(因为等级最高的英雄群体都有潜力达到目标等级)。
  7. 否则,输出0,因为即使所有英雄都参与历练,也无法达到目标等级。

  之前的思路是这样,排序、先考虑最大等级的,达到满级后再考虑后面的,后来发现,只要存在一个高等级的英雄和一个低等级的英雄,就一定可以让他俩一直历练,最后肯定能把高等级的升到满级;

所以,换个思路:初始情况下,等级不是最低的英雄都可以通过和等级最低的英雄(可能不止一个)历练,从而升满,所以可以直接从原来的英雄数量中减去等级最低英雄的数量,就得到的能升满的英雄数量。
发现是能跑通的,不存在上面所说的英雄的初始等级已经超过满级的情况...

def solution(n, u):
    min_level=min(u)
    min_count=len([i for i in u if i==min_level])
    return len(u)-min_count

if __name__ == '__main__':
    print(solution(n = 5, u = [1, 2, 3, 1, 2]) == 3)
    print(solution(n = 4, u = [100000, 100000, 100000, 100000]) == 0)
    print(solution(n = 6, u = [1, 1, 1, 2, 2, 2]) == 3)
总结

  理解历练机制和如何通过排序和简单的数学计算来确定结果;

  可能有时候把问题想得太复杂,换个思路或者着手点可能会比较简单。