【问题标题】:How to quicken this algorithm in python如何在python中加快这个算法
【发布时间】: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() 不关心空白,重新制作字符串会稍微减慢你的速度。

标签: python algorithm


【解决方案1】:

无需将 Alice 的分数附加到 scores。首先确保scores是从高到低排序的。

然后对于爱丽丝的每个分数,计算她的排名如下:

rank = 1 开始并遍历scores 的列表。每当您查看的分数小于前一个分数时,将 1 加到 rank 并在您查看的分数等于或小于 Alice 的分数时返回 rank 的值。

编辑

这个答案假设只有每个玩家的最高分是相关的。

【讨论】:

  • 如果是这种情况,试试 alice = max([int(alice_temp) for alice_temp in input().strip().split(' ')])
  • @user1269942 根据我对任务的理解,输出应该是 Alice 对她每个分数的排名。在这种情况下,最大值无济于事
猜你喜欢
  • 2019-10-11
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 2016-06-28
  • 2011-02-09
相关资源
最近更新 更多