Домашние задания: Информатика

Информатика 10 класс

помогите пожалуйста оптимизировать код =(((( по ограничению во времени не проходит тест, пишет TL
Тут алгоритм кубической сложности. Как хорошо, что хоть где-то ещё обращают внимание на разбазаривание вычислительных ресурсов.

Вот твои три вложенных пробега по списку:
 1) i = 0...p-1
2) j = i...p-1
3) sum(a[i...j])
Всего получается примерно p³/4 итераций.
Вероятно, из этих трёх пробегов можно оставить только первые два, снизив количество итераций до p²/2.

Сумму вычисляем накопительным итогом: перед вторым циклом переменную ставим в 0 или в первое значение, а в самом цикле прибавляем к ней a[j] и вычитаем поправку (которая между соседними значениями примет значение или b, или 0).
Получится квадратичный алгоритм. Пролезет в тайм лимит или нет - зависит от многих условий, которые ты нам не сообщил.

Если ты этот код не содрал где-то, а написал сам, то легко сможешь доработать. Примерно что-то такое должно получиться (я это не проверял):
 for i in range(p):
profit = a[i] - b # сразу учитываем первое слагаемое для i = j
for j in range(i + 1, p):
if profit > max_profit: max_profit = profit
profit += a[j] + b * ((j - i) // k - (j - i - 1) // k)
if profit > max_profit: max_profit = profit

Для дальнейшей оптимизации необходимо знать условие задачи и всё, что можно, о структуре входных данных. Может быть, можно квадрат свести к меньшей степени или к логарифму. Или, на худой конец, снизить константные факторы, например, вместо делений на k сделать инкремент счётчика по модулю, или проверять profit на максимум не всегда, а только когда он увеличивается.
РЗ
Родя Завадский
87 571
Лучший ответ
Бейбут Исаханов тот алгоритм (см. выше) соответствует этой задаче, тесты не проходит из-за TL, но в то же время ответы выдает правильные. А алгоритм, который Вы написали, ответы не те выдает, можете помочь пожалуйста =((((