训练士兵

56 阅读1分钟

本题目来源于蓝桥杯题库19703

基础代码

只通过了30%的样例

主要缺点在于以下两点

1.存在嵌套循环

2.存在重复计算

n,s = map(int,input().split())
a = [0]*(n+1)
b = [0]*(n+1)

for i in range(n):
    x,y = map(int,input().split())
    a[i]=x
    b[i]=y

money=0
for i in range(max(b)):
    cnt = 0
    for j in range(n):
        if b[j]>0:
            cnt+=a[j]
            b[j]-=1
    if cnt > s:
        money+=s
    else:
        money+=cnt
print(money)

优化后

下面是优化后的代码:

n,s = map(int,input().split())
m = [list(map(int,input().split())) for i in range(n)]

m.sort(key=lambda x:x[1])
sum_m = sum([ i[0] for i in m])

money,b = 0,0
while sum_m > s:
    money=s*m[0][1]
    # 记录团练总次数
    b = m[0][1]
    sum_m-=m[0][0]
    m.pop(0)

money += sum([i[0]*(i[1]-b) for i in m])
print(money)

时间复杂度优化

  • 第一段代码复杂度:第一段代码有两层嵌套循环,外层循环次数取决于 max(b),内层循环次数为 n,因此时间复杂度为 O(n×max(b))。当 max(b) 很大时,代码的运行时间会显著增加。
  • 第二段代码复杂度:第二段代码主要包括排序操作和一次遍历操作。排序操作的时间复杂度为 O(nlogn),遍历操作的时间复杂度为 O(n)。因此,第二段代码的总体时间复杂度为 O(nlogn),在处理大规模数据时,性能更优。