【发布时间】:2017-04-06 17:50:34
【问题描述】:
问题陈述是:
得分最高的玩家在排行榜上排名1。
得分相同的玩家获得相同的排名编号,下一位玩家获得紧随其后的排名编号。
例如,四个玩家的分数分别为 100、90、90、80 和 .这些玩家将分别获得排名 1、2、2 和 3。
使用这种排名方法,需要根据他/她在进行过程中获得的分数来计算玩家的排名,作为输入提供的玩家分数('scores'列表)。其次,提供了特定玩家“alice”的分数,对于她玩的每一场游戏,都需要计算她在排行榜上的位置。
假设排行榜上有 6 位玩家得分为[100,100,50,40,40,20,10]。 Alice 玩了她的第一场比赛,得到 5 分,她以第 6 名排在列表的底部。下一场比赛她得到 25,现在她排在第 4 名。接下来她得到 50,在下一场比赛中,这个她的等级是 2。
#!/bin/python3
import sys
n = int(input().strip())
scores = [int(scores_temp) for scores_temp in input().strip().split(' ')]
m = int(input().strip())
alice = [int(alice_temp) for alice_temp in input().strip().split(' ')]
# your code goes here
for _ in alice:
scores.append(_)
print(list(sorted(set(scores),reverse=True)).index(_)+1)
此代码适用于 200~500 范围内的输入。但是如果它进入像 10*9 这样的非常高的输入,代码会由于超时而终止。我想知道如何即兴创作这段代码以使其运行得更快
编辑
n = int(input().strip())
scores = sorted(set([int(scores_temp) for scores_temp in input().strip().split(' ')]),reverse=True)
m = int(input().strip())
alice=[int(alice_temp) for alice_temp in input().split(' ')]
for a in alice:
rank=1
for _ in scores:
if(a<_):
rank=rank+1
else:
#print(rank)
break
print(rank)
进行了此更改,但仍然点击“因超时而终止”,请提出需要修改的内容
【问题讨论】:
-
@MarkSchultheiss 哈哈
-
风格挑剔:不要使用
_作为名称,除非它是一次性变量(在您的情况下不是,因为您在循环中使用它)。 -
如果事实上需要这样的东西来大规模收集数据,您需要重新设计它,这样它就不需要处理所有事情 每个更新。只需运行一个守护程序来保存所有玩家的当前分数,并根据最新的分数请求进行更新。还可以根据需要添加/删除玩家。你需要的是一个新程序,而不是算法。
-
无论如何,这听起来像是
heapq的用例 -
另外,不要费心剥离输入。 int() 不关心空白,重新制作字符串会稍微减慢你的速度。