Python

Превышение лимит времени. Как сделать скорость по меньше?

Я написал правильно код
примеры правильно выводит:

import math

n, k, s = map(int, input().split())
a = list(map(int, input().split()))
max_coins = 0
for i in range(n):
for j in range(i + 1, n + 1):
coins = sum(a[i:j]) - math.ceil(len(a[i:j]) / k) * s
if coins > max_coins:
max_coins = coins

print(max_coins)

Это из задачи:
Евгений — логист, и у него есть n товаров. За продажу i-го товара компания получит ai монет прибыли (она может быть и отрицательной). В стране, в которой живет Евгений, странные правила выбора товаров для доставки: Евгений может выбрать любой отрезок товаров, но только один, и доставить все товары на этом отрезке (отрезком называется непрерывная последовательность товаров). Для доставки нужны грузовики, в каждый из которых помещается не более k любых товаров, причем за использование каждого грузовика нужно заплатить s монет. Найдите, какое максимальное количество монет может получить Евгений, учитывая затраты на грузовики.

Формат ввода

Первая строка содержит три целых числа n, k и s (1≤n≤105,1≤k≤10,1≤s≤109) — количество товаров, а также числа k и s.
Вторая строка содержит n целых чисел a1,a2,…,an (−109≤ai≤109) — стоимости товаров.

Формат вывода

Выведите одно число — максимальное количество монет, которое может получить Евгений

Пример 1

Ввод:
6 3 10
0 -4 16 -7 3 8
Вывод:
6

Пример 2

Ввод:
3 2 10
9 9 9
Вывод:
8

Пример 3

Ввод:
5 3 15
3 2 4 5 1
Вывод:
0

Пример 4

Ввод:
10 3 5
-3 9 7 15 -10 9 7 6 -1 0
Вывод:
28

Примечания

В первом примере оптимально будет выбрать только товар со стоимостью 16 и потратить 10 монет на один грузовик.
Во втором примере оптимально выбрать любой отрезок из двух товаров.

В третьем примере не получится доставить ни одного товара так, чтобы получить прибыль.

В четвертом примере оптимально будет выбрать отрезок от второго товара до восьмого.

Можете подсказать, как уменьшить скорость для времени, чтобы не так быстро выводил?
D.
Devito ..........
190
Снова Евгений-логист. Тебе же уже отвечали на этот вопрос. Используй алгоритм Кадане, модифицированный под штрафы. Он имеет сложность O(n*k). А то, что найденный тобой на просторах сети "понятный" быдлокод корректно работает на паре примеров, ещё не значит, что он пройдёт тест по времени на 10 тыс. чисел, т.к. его сложность O(n²).

Вот код, если что:
 p, k, s = (int(t) for t in input().split())
a = list(int(t) for t in input().split())

max_profit = 0
maxp = [0] * k
for i in range(k - 1):
m = min(k, i + 1)
maxp = [max(maxp[-1] + a[i], 0) - s] + [max(maxp[i - 1] + a[i], -s) for j in range(1, m)] + [0] * (k - m)
for i in range(k - 1, p):
maxp = [max(maxp[-1] + a[i], 0) - s] + [max(maxp[j - 1] + a[i], -s) for j in range(1, k)]
max_profit = max(*maxp, max_profit)

print(max_profit)

В принципе, тут и список 'a' не нужен, хватило бы итератора. Один проход. Тогда памяти бы меньше занимал (хотя, не факт, т.к. Питон может удерживать в памяти результат input().split(), пока всё не обработается).
 p, k, s = (int(t) for t in input().split())
a = (int(t) for t in input().split())

max_profit = 0
maxp = [0] * k
for i in range(k - 1):
m = min(k, i + 1)
e = next(a)
maxp = [max(maxp[-1] + e, 0) - s] + [max(maxp[i - 1] + e, -s) for j in range(1, m)] + [0] * (k - m)
for i in range(k - 1, p):
e = next(a)
maxp = [max(maxp[-1] + e, 0) - s] + [max(maxp[j - 1] + e, -s) for j in range(1, k)]
max_profit = max(*maxp, max_profit)

print(max_profit)
ОС
Олег Стасевич
87 571
Лучший ответ
Devito .......... О, привет.
Твой вариант тоже хороший. Просто я выполняю олимпиаду и я долго как правильно писать. Твой вариант тоже подходит и ответы правильно выводит. Только на этой олимпиаде говорят, что слишком только считает,хотя выводит всё отлично.
Devito .......... Всё равно молодец!! Всё же работает идеально! Либо я дебил, либо олимпиада дурацкая.
Devito .......... Ладно, я постараюсь найди и правильно напишу
пусть f[i] - максимальная прибыль, которую можно получить со всех отрезков, заканчивающихся в позиции i (не включительно)
тогда f[i] = max(f[i - k] + sum(a[i-k:i]) - s, sum(a[i-k+1..i]) - s, ..., sum(a[i-1..i]) - s)
ответ - max(f)
сложность O(nk)
у твоего сложность где-то O(n^3), поэтому он и не проходит
Антон Абоянцев
Антон Абоянцев
36 952
Олег Стасевич О да, это превратит квадратичный алгоритм в кубичный и прекрасно замедлит его. Результата на n=10 тыс придётся ждать несколько часов.
Люди стараются ускорить, а тут — замедлить. Разве в питон нету задержки вывода, какого нибудь таймера?