【问题标题】:Time limit exceeds超过时限
【发布时间】:2020-02-17 11:26:59
【问题描述】:

有 N 位车手参加锦标赛。每场比赛结束后,他们都会获得积分,包括最后一场比赛。比赛获胜者获得 N 分,亚军获得 N - 1 分,以此类推,直到最后一名车手获得 1 分。两名车手不能在同一地点完成比赛。

编写一个程序,根据每位车手在最后一场比赛前获得的总积分数,计算有多少车手在最后一场比赛后仍有机会获得最大积分从而赢得冠军。如果多个车手的最高总分相同,他们都会获得世界冠军头衔。

我的所有测试用例都超出了时间限制,并且我的代码在一个测试用例中失败了 100 名参与者。 测试用例是:

测试用例 1:
3
10
9
8
输出 3
测试用例 2:
5
15
14
12
14
15
输出 4
这是我的代码:

n=int(input())
b=[]
for i in range(n) :
    b.append(int(input()))
l=len(b)
c=l
sort(b)-->>> some sorting algo to sort in O(n*logn)
for i in range(len(b)) :
    x=b[i]
    x+=l
    for j in range(i+1,len(b)) :
        l-=1
        y=b[j]
        y+=l
        if y>x :
            c-=1
            break
print(c)``

【问题讨论】:

  • 什么测试用例?给我们看一看!并制定一个good question

标签: python python-3.x optimization


【解决方案1】:

你把事情复杂化了,这可以在 O(NlogN) 中轻松解决,假设 results 是驱动程序的当前结果,N 是驱动程序的数量。您所要做的就是:

N = 5
results = [ 15, 14, 12, 14, 15 ]
# find who can achieve the highest result
max_points = max([a+b for a,b in enumerate(sorted(results, reverse=True))])
# now count how many drivers can get as much as "max_points"
has_potential = [ 1 for r in results if r+N-1 >= max_points ]
print len(has_potential)   # print the result

输出:

4

【讨论】:

  • 对于这个输入输出是 4 而不是 5
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多