程序因超时而终止

时间:2017-05-19 00:13:18

标签: python algorithm python-3.x

问题:

您将获得一个大小为N的列表,用零初始化。您必须在列表上执行M操作并输出列表中所有元素的最大值。对于每个操作,您将获得三个整数a,b和k,并且您必须为从索引a到b(包括两者)的所有元素添加值。

输入格式

第一行将包含由单个空格分隔的两个整数N和M. 下一行将包含由单个空格分隔的三个整数a,b和k。 列表中的数字从1到N编号。

这是我写的代码:

n,m=map(int,input().split())
arr=[]
for i in range(n+1):
   arr.append(0)
for j in range(m):
    a,b,k=map(int,input().split())
    for i in range(a,b+1):
        arr[i]+=k;

print(max(arr))    

当我尝试提交我的解决方案时,我会收到“TORINATED DUE TO TIMOUT”消息。请您建议一个避免这类错误的策略,并解决问题。

提前致谢!

2 个答案:

答案 0 :(得分:0)

不要遍历列表范围;相反,再次使用map来增加指示的值。像

这样的东西
for j in range(m):
    a,b,k=map(int,input().split())
    arr[a:b+1] = map(lambda <increment-by-k>, arr[a:b+1])

这应该让您的居民优化进入并节省一些时间。

答案 1 :(得分:0)

您可能需要一种比O(M * N)具有更高复杂度的算法。

您可以将区间分隔符放在列表中:

n,m=map(int,input().split())
intervals = []
arr = [0 for i in range(n)]

for j in range(m):
    a,b,k=map(int,input().split())
    intervals += [(str(a), "begin", k)]
    intervals += [(str(b), "end", k)]
intervals = sorted(intervals, key=lambda x: x[0]+x[1])

k, i = 0, 0
for op in intervals:
    ind = int(op[0])
    if op[1] == "begin":
        while ind > i:
            arr[i] += k
            i += 1
        k += op[2]
    else:
        while i <= ind:
            arr[i] += k
            i+= 1
        k -= op[2]

print(arr)

如果排序算法为O(MlogM),则为O(MlogM + N)