我刚刚开始进行竞争性编程,在针对某些问题编写解决方案后,我发现 RUNTIME超出错误。
a 是元素列表而 i , j 是索引我需要获取 max()强烈的>上述表达。
这是一个简短但完整的代码段。
t = int(input()) # Number of test cases
for i in range(t):
n = int(input()) #size of list
a = list(map(int, str(input()).split())) # getting space separated input
res = []
for s in range(n): # These two loops are increasing the run-time
for d in range(n):
res.append(abs(a[s] - a[d]) + abs(s - d))
print(max(res))
Input File此链接可能会过期(希望它有效)
C语言的排行榜运行时间为5秒, Python的运行时间为35秒,而此代码需要 80秒。
在线评判如此独立于机器。 numpy不可用。
请保持简单我是python的新手。
感谢阅读。
答案 0 :(得分:1)
"竞争性节目"不是通过使用不同类型的循环来节省几毫秒;关于如何处理问题,以及然后有效地实施解决方案。
然而,跳出来的一件事是你浪费时间建立一个列表只扫描它以找到最大值。您的双循环可以转换为以下内容(忽略其他可能的改进):
print(max(abs(a[s] - a[d]) + abs(s - d) for s in range(n) for d in range(n)))
但那是小鱼苗。首先担心你的算法,然后转向甚至明显的时间浪费。正如@Brett向您展示的那样,您可以将比较次数减少一半,但我会首先研究问题并问自己:我是否真的需要计算此数量n^2
次,甚至0.5*n^2
次?这就是你如何缩短时间,而不是缩短毫秒。
答案 1 :(得分:1)
对于给定的j<=i
,|a[i]-a[j]|+|i-j| = max(a[i]-a[j]+i-j, a[j]-a[i]+i-j)
。
因此对于给定的i
,最大化j<=i
的{{1}}的值是最大化|a[i]-a[j]|+|i-j|
的{{1}}或j
最小化a[j]-j
。
这两个值都可以在您沿着数组运行时计算,给出一个简单的O(n)算法:
j
这是针对一个天真但明显正确的算法进行的一些简单测试:
a[j]+j
在大小为10 ^ 5的数组上运行def maxdiff(xs):
mp = mn = xs[0]
best = 0
for i, x in enumerate(xs):
mp = max(mp, x-i)
mn = min(mn, x+i)
best = max(best, x+i-mn, -x+i+mp)
return best
只需要几分之一秒,这明显优于您报告的排行榜得分。