
Домашние задания: Информатика
Информатика 10 класс
помогите пожалуйста оптимизировать код =(((( по ограничению во времени не проходит тест, пишет TL

Тут алгоритм кубической сложности. Как хорошо, что хоть где-то ещё обращают внимание на разбазаривание вычислительных ресурсов.
Вот твои три вложенных пробега по списку:
Вероятно, из этих трёх пробегов можно оставить только первые два, снизив количество итераций до p²/2.
Сумму вычисляем накопительным итогом: перед вторым циклом переменную ставим в 0 или в первое значение, а в самом цикле прибавляем к ней a[j] и вычитаем поправку (которая между соседними значениями примет значение или b, или 0).
Получится квадратичный алгоритм. Пролезет в тайм лимит или нет - зависит от многих условий, которые ты нам не сообщил.
Если ты этот код не содрал где-то, а написал сам, то легко сможешь доработать. Примерно что-то такое должно получиться (я это не проверял):
Для дальнейшей оптимизации необходимо знать условие задачи и всё, что можно, о структуре входных данных. Может быть, можно квадрат свести к меньшей степени или к логарифму. Или, на худой конец, снизить константные факторы, например, вместо делений на k сделать инкремент счётчика по модулю, или проверять profit на максимум не всегда, а только когда он увеличивается.
Вот твои три вложенных пробега по списку:
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 на максимум не всегда, а только когда он увеличивается.
Бейбут Исаханов
тот алгоритм (см. выше) соответствует этой задаче, тесты не проходит из-за TL, но в то же время ответы выдает правильные. А алгоритм, который Вы написали, ответы не те выдает, можете помочь пожалуйста =((((

Похожие вопросы
- Информатика 10 класс
- Информатика 10 класс. Паскаль
- ИНФОРМАТИКА 10 КЛАСС
- Информатика 10 класс
- Информатика 10 класс Паскаль.
- Помогите пожалуйста!!! Информатика 10 класс Паскаль
- Срочно. Информатика 10 класс, написать программу
- Информатика 10 класс Pascal
- Информатика 10 класс паскаль
- Информатика 10 класс