如何提高以下程序的速度?

时间:2019-07-15 22:13:34

标签: arrays python-3.x

我正在尝试解决以下问题。

  

系统会为您提供n个数字和q个查询的数组。对于每个查询,您必须将子数组的期望值(均值)的底数从L打印到R。

     

第一行包含两个整数N和Q,分别表示数组元素的数量和查询的数量。

     

下一行包含N个由空格分隔的整数,它们表示数组元素。

     

接下来的Q行包含两个整数L和R(数组的索引)。

     

打印一个表示答案的整数。*

我已将print()替换为stdout.write(),将input()替换为stdin.readline()

from sys import stdin, stdout

x,y=map(int,stdin.readline().split())

array=[int(x) for x in stdin.readline().split()]

result=[]

sum=0
for i in range(y):
    l,r=map(int,stdin.readline().split())
    for i in range(l-1,r):
        sum = sum + array[i]
    result.append(sum//(r-l+1))
    sum=0

for i in result:
    stdout.write(str(i)+"\n")

我的代码花费的时间约为8秒,解决挑战时间限制为1.5秒

2 个答案:

答案 0 :(得分:0)

如果您将1-i的和存储在数组的第i个值中,则这种类型的问题通常非常简单,如下所示:

from sys import stdin, stdout

x,y=map(int,stdin.readline().split())

array=[int(x) for x in stdin.readline().split()]
sums = [sum(array[:i]) for i in range(len(array))]

result=[]

for i in range(y):
    l,r=map(int,stdin.readline().split())
    result.append((sums[r-1]-sums[l-1])//(r-l+1))

for i in result:
    stdout.write(str(i)+"\n")

通过推定,它将程序的速度从O(N ^ 2)更改为O(N),这应该快得多。

答案 1 :(得分:-1)

删除附加操作。这是一项代价高昂的操作,并且因为您不会重复使用结果而不必要。相反,请直接执行:

for i in range(l-1,r):
    sum = sum + array[i]
stdout.write(str(sum//(r-l+1))+"\n")

通过这样做,您也避免了经历第二个循环。 如果您尝试尝试,请在此处报告所需的时间。