游戏英雄升级潜力评估
题目描述
小U在一款挂机游戏中拥有n个英雄。游戏中有一种历练升级机制,每天可以选择两个英雄进行历练,如果两位英雄的等级相同,则他们的等级都不会改变。如果英雄等级不同,那么等级较高的英雄会增加1级,而等级较低的英雄则保持不变。
小U希望至少有一个英雄能够达到2000000000000000级,他想知道有多少英雄有潜力通过历练达到这个等级。
思路解析
- 首先先看题目第二段,让英雄达到2000000000000000级(正常游戏也达不到这么高吧),这个数值我们可以认为时无穷大,如果我们像跟随题目步伐让大量英雄达到这个级别,消耗的时间和算力是比较可怕的。
- 然后回到第一段,如果两位英雄等级相同,他们等级都不会改变,这里可以判断特殊情况如果等级全部相同则没有人可以达到2000000000000000级。这里我考虑了一种特殊情况,如果有人已经达到这个超级大的等级,那有潜力达到这个等级的人要相应地减少,因为根据通过历练达到这个等级这句话,已经达到这个数字的不需要通过历练来达到,但是在所有测试数据中并没有出现该情况,故可省略,如果有需要,我后面还会附上特殊情况代码 3.根据如果英雄等级不同,等级较高的英雄会增加1级,反之,等级较低的英雄不会增加,那么等级最低的英雄无法升级,因为没有其他英雄等级会比他低,那么所有其他英雄等级都会比最低的高,即,只要等级比最低的高,都可以无限地升级直到那个特别大的数字 4.最后判断方法可以通过从0开始一个一个加,也可以从n(假设都可以升到超大等级)开始一个一个减去。
解题步骤
1.我这里假设都可以升到最大级,那么结果result假设为n,并将list进行排序,那么u[0]就是最小值(也可以直接找u的最小值,直接找会更省时间)
result=n
u.sort()
min=u[0]
2.遍历所有数据,一旦发现有和最小值相同的,n-1,因为两个最小值无法让任意其中之一升级
for i in range (0,n,1):
if u[i]==min:
result-=1
3.返回最终答案result
return result
完整代码
def solution(n: int, u: list) -> int:
result=n
u.sort()
min=u[0]
for i in range (0,n,1):
if u[i]==min:
result-=1
# write code here
return result
if __name__ == '__main__':
print(solution(n = 5, u = [1, 2, 3, 1, 2]) == 3)
print(solution(n = 6, u = [1, 1, 1, 2, 2, 2]) == 3)
总结时刻
这道题的算法很简单,就是找到最小值,并遍历一个一个比对。最大的难点在于分析题目,需要得出那个超级大的数没有意义,只要认为是无穷大即可,其次要从题目中得出最小值无法升级的结论就可以轻松解出这道题。