我正在尝试在HackerRank上解决这个问题:
Animesh有N个空糖果罐,编号从1到N,容量无限。他表演M. 操作。每个操作由3个整数a,b和k描述,其中a和b是>罐的索引,k是在每个罐内添加的糖果的数量,其中索引在a和b之间(包括两者)。你可以告诉M操作后的平均糖果数量吗? 我在Python 3中编写了以下代码:
def operate(a, b, k, array):
for i in range(a - 1, b):
array[i] += k
def mean(array):
return int(sum(array) / len(array))
splitinput = [int(x) for x in input().split()]
candy = []
for i in range(splitinput[0]):
candy.append(0)
for j in range(splitinput[1]):
splitinput2 = input().split()
operate(int(splitinput2[0]), int(splitinput2[1]), int(splitinput2[2]), candy)
print(mean(candy))
它有效,但在一些测试用例上超时。我怎么能更快地做到这一点?我已经在Python中编写了一段时间,但优化的细节仍然无法实现。
答案 0 :(得分:2)
你不关心糖果在哪里。只要您知道有多少糖果和多少罐子,您就可以计算出平均值。因此,你可以保留所有糖果的一个数量:
jars, ops = map(int, input().split())
candies = 0
for i in range(ops):
a, b, k = map(int, input().split())
candies += k*(b-a+1)
print candies / jars
这避免了必须跟踪N个单独的计数或为每个操作增加k个计数器。当你得到大的k值时,这非常重要。