问题描述
小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
解答思路
-
理解游戏规则:
- 每天可以选择两个英雄进行历练。
- 如果两个英雄的等级相同,等级不变。
- 如果等级不同,等级较高的英雄升级,等级较低的英雄保持原等级。
-
确定目标:
- 至少有一个英雄达到2000000000000000级。
- 计算有多少英雄有潜力通过历练机制达到极高水平。
-
分析潜力:
- 由于每次历练中,等级较高的英雄会升级,而等级较低的不会变,这意味着低等级的英雄会“促进”高等级英雄的成长速度。
- 因此,拥有最低等级的英雄数量成为关键。如果存在至少一个等级最低的英雄,则其他英雄理论上都可以历练升级到目标等级。
-
算法设计:
- 找出数组
u中的最小值(最低等级)及其出现的次数(minNum)。 - 除了这些最低等级的英雄外,其余英雄理论上都有可能通过与其他非最低等级的英雄进行历练,逐渐提升等级,直至接近或达到目标等级。
- 因此,有潜力的英雄数量等于总英雄数减去最低等级英雄的数量(
u.length - minNum)。
- 找出数组
方法实现
public class Main {
public static int solution(int n, int[] u) {
if (n <= 1) {
// 如果只有一个英雄,则无法通过历练提升等级,返回0
return 0;
}
// 最小等级
long min = Long.MAX_VALUE;
// 最小等级角色数量
int minNum = 0;
// 遍历数组u,找出最小等级及其出现次数
for (int i : u) {
if (i < min) {
min = i;
minNum = 1;
} else if (i == min) {
minNum++;
}
}
// 返回有潜力的英雄数量
return u.length - minNum;
}
public static void main(String[] args) {
// 测试样例
System.out.println(solution(5, new int[] { 1, 2, 3, 1, 2 }) == 3); // 输出3
System.out.println(solution(4, new int[] { 100000, 100000, 100000, 100000 }) == 0); // 输出0
System.out.println(solution(6, new int[] { 1, 1, 1, 2, 2, 2 }) == 3); // 输出3
}
}
代码分析
- 初始化:首先检查英雄总数
n,如果n小于等于1,则直接返回0,因为没有其他英雄可以与之历练。 - 寻找最小值:通过遍历数组
u,找出最小等级min及其出现次数minNum。 - 计算潜力英雄数量:根据游戏规则,最低等级的英雄的存在可以使得其他英雄升级,因此有潜力的英雄数量等于总英雄数减去最低等级英雄的数量。
总结
本题通过考察游戏规则和逻辑推理,设计了一个简单的算法来评估英雄升级的潜力。该算法的关键在于识别出最低等级的英雄数量,这是限制其他英雄升级速度的关键因素。通过计算非最低等级英雄的数量,我们能够得出有潜力达到极高等级的英雄数量。这种方法不仅高效,而且易于理解和实现,是解决此类问题的有效策略。