大家好。我编写了以下代码。请帮助我优化这个,当我在一些测试用例中提交编译器的编写时间限制超过2.069s/13.33Mb时
import math
N = int(input())
arr = [None]*N; new_list = []
stepen = 0; res = .0;
arr = input().split(" ")
arr = [float(h) for h in arr]
Q = int(input())
for j in range(Q):
x, y = input().split()
new_list.extend([int(x), int(y)])
for i, j in zip(new_list[0::2], new_list[1::2]):
stepen = (j - i)+ 1
res = math.prod(arr[i:j+1])
print(pow(res, 1./stepen))
算法中最慢的是
math.prod(arr[i:j+1])
。如果所有的x
和y
输入都表示整个范围,那么您肯定会发现,因为对prod
的调用必须在整个范围内循环为了避免这种情况,必须在数组中使用前缀乘积。其思想是:保留第二个数组
pref
,其属性为pref[i] = arr[i] * pref[i-1]
。因此,pref[i]
将是第i
位和第arr
位之前的所有内容的产物然后要查找位置
i
和j
之间的乘积,需要pref[j] / pref[i-1]
。看看你是否能找出为什么这会给出正确的答案相关问题 更多 >
编程相关推荐