本题目来源于蓝桥杯题库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),在处理大规模数据时,性能更优。