青训营X豆包MarsCode 技术训练营 | 豆包MarsCode AI 刷题27游戏英雄升级潜力

34 阅读3分钟

问题描述

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

小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. 问题理解

我们拥有 n 个英雄,每天可以选择两个英雄进行历练操作,其升级规则取决于两个英雄的初始等级情况。我们的目标是找出在给定的操作规则下,有多少个英雄有可能通过一系列的历练达到 2000000000000000 级。

2. 关键思路

  • 为了使某个英雄能够达到尽可能高的等级,我们应该总是选择这个英雄与等级最低的其他英雄进行历练。这样可以保证每次历练时,目标英雄都有机会提升等级(只要它的等级高于与之历练的英雄等级),而不会出现因为选择了两个高等级英雄导致等级无法提升的情况。
  • 假设我们要判断英雄 i 是否有潜力达到目标等级。我们可以模拟这个提升过程,从初始状态开始,不断选择英雄 i 与当前等级最低的其他英雄进行历练,看最终英雄 i 是否能够达到 2000000000000000 级。
public class Main {
    public static int solution(int n, int[] u) {
        int min = u[0];
        int count = 0;
        for(int i = 0; i < n; i ++){
            if (min > u[i]) {
                min = u[i];
            }
        }
        for(int i = 0; i < n; i ++){
            if (u[i] > min) {
                count ++;
            }
        }

        // write code here
        return count;
    }

    public static void main(String[] args) {
        System.out.println(solution(5, new int[]{1, 2, 3, 1, 2}) == 3);
        System.out.println(solution(4, new int[]{100000, 100000, 100000, 100000}) == 0);
        System.out.println(solution(6, new int[]{1, 1, 1, 2, 2, 2}) == 3);
    }
}
  • 逻辑流程

    1. 首先通过一个 for 循环遍历数组 u,目的是找到数组中的最小值。在每次循环中,如果当前元素 u[i] 比已记录的最小值 min 还要小,就更新 min 的值为当前元素的值。
    2. 然后再通过另一个 for 循环遍历数组 u,这次是为了统计数组中大于最小值 min 的元素个数。每当遇到一个元素 u[i] 大于 min 时,就将 count 的值增加 1
    3. 最后,返回统计得到的 count 值,即数组 u 中大于最小值的元素个数。