Задание №168134: Задание 5
5 Замечание В примере слон Семён совершил 5 заездов. Среди них есть 3 заезда на дистанцию от 3 километров каждый (это заезды на 3, 4 и 5 км), поэтому уровень слона Семёна может быть равен 3. Можно показать, что следующий уровень им ещё не достигнут. Страница 4 из 6 Пригласительный этап всероcсийской олимпиады по информатике для 8–10 классов 29-30 мая 2025
Что проверяет это задание
Задание относится к теме «Задание 5» и рассчитано на уровень 8 класса. Для решения понадобятся:
- анализ условия
- пошаговое рассуждение
- проверка результата
Источник: ВсОШ в Москве — официальный архив · 2025
Качество материала
Показываем, из чего состоит страница и можно ли проверить материал по первоисточнику.
Последняя проверка решения:
Происхождение задания
- Банк заданий
- ВсОШ в Москве — официальный архив
- Организатор
- Редакция «Я сам решу»
- Год материала
- 2025
- Материалы
- 2 файла
Связанные понятия
План самостоятельного решения
- Перепишите известные данные и отдельно сформулируйте, что требуется найти или доказать.
- Свяжите условие с темой «Задание 5» и выберите подходящее правило, формулу или способ рассуждения.
- Запишите промежуточные шаги: это помогает заметить потерянный знак, случай или логический переход.
- Сверьте результат со всеми ограничениями условия и только затем откройте подробный разбор.
Ориентировочное время: 15 минут.
Закрепить тему
После разбора попробуйте решить ещё десять заданий по предмету «Искусственный интеллект». Вариант формируется заново, а ответы можно сразу проверить.
Решение по шагам
Задача 5. Хлеб и зрелище
В этой задаче в данном массиве из n элементов нужно найти два отрезка длины t каждый с
минимальной общей суммой, при этом между отрезками должен быть хотя бы один элемент, не
принадлежащий этим отрезкам.
Самая простая идея — перебрать начала двух отрезков. Если индекс первого элемента левого
отрезка равен i, то правый отрезок может иметь начальным элементом отрезок с индексом j = i+t+1
или больше, начиная с этого значения и будем перебирать j. Дальше посчитаем суммы элементов
на данных отрезках и выберем из них наименьшее. Такое решение будет иметь сложность O(n2t).
n = int (input ())
t = int (input ())
d = [ int (input ()) for i in range(n )]
Страница 3 из 5
Пригласительный этап всероcсийской олимпиады по информатике для 8–10 классов
29-30 мая 2025
ans = 10∗∗9
i = 0
while i + 2 ∗ t + 1 <= n:
j = i + t + 1
while j + t <= n:
ans = min(ans , sum(d[ i : i+t ]) + sum(d[ j : j+t ] ) )
j += 1
i += 1
print ( ans )
Это решение можно улучшить при помощи стандартного приёма: предподсчитаем значения каж-
дой нужной нам суммы. Пусть sums[i] будет равно сумме элементов массива d, начиная с i-го эле-
мента. Один раз вычислим эти суммы, чтобы впоследствии не считать их заново. Сами эти суммы
легко посчитать при помощи техники «скользящего окна»: если мы посчитали сумму элементов от
d[i] до d[i+t−1], то чтобы перейти к следующей сумме нужно добавить значение d[i+t] и вычесть
значение d[i].
Такое решение будет иметь сложность O(n2).
n = int (input ())
t = int (input ())
d = [ int (input ()) for i in range(n )]
sums = [ 0 ] ∗ (n − t + 1)
sums [ 0 ] = sum(d [ 0 : t ])
for i in range(0 , n − t ):
sums [ i +1] = sums [ i ] + d[ i+t ] − d[ i ]
ans = 10∗∗9
i = 0
while i + 2 ∗ t + 1 <= n:
j = i + t + 1
while j + t <= n:
ans = min(ans , sums [ i ] + sums [ j ])
j += 1
i += 1
print ( ans )
Наконец, чтобы улучшить и это решение, можно заметить, что если мы выбрали какой-то ответ,
то первый отрезок можно двигать на некотором префиксе нашего массива, а второй отрезок — на
некотором суффиксе. То есть задача сводится к тому, что мы должны выбирать наименьшее значе-
ние среди значений массива sums на некотором его префиксе или суффиксе. Это можно сделать при
помощи стандартной техники префиксных минимумов — предподсчитаем минимумы на всех пре-
фиксах и всех суффиксах массива. Это можно сделать за O(n). Дальше можно, например, перебрать
ту минуту, которую Петя обязательно проведёт в магазине. Нужно рассмотреть префиксы массива,
не включающие эту минуту, и выбрать на этом префиксе отрезок из t элементов с минимальной
суммой. Затем нужно рассмотреть суффиксы, не включающие эту минуту, и выбрать на этом суф-
фиксе отрезок длины t с минимальной суммой. Используя массивы префиксных и суффиксных
минимумов, это можно сделать за O(1), и общее решение будет иметь сложность O(n).
У этой идеи есть разные варианты, например, рассмотрим решение, вообще не использующее
вспомогательные массивы. В этом решении мы будем перебирать индекс j начала правого отрезка. А
значение i будет равно максимальному возможному началу левого отрезка, на самом деле i=j−t−1,
но для простоты будем использовать две переменные. Переменная sum1 будет равна сумме отрезка
длины t, начиная с индекса i, а переменная sum2 будет равна сумме отрезка длины t, начиная с
индекса j.
При увеличении i и j на 1 переменные sum1 и sum2 пересчитываются добавлением одного и
вычитанием другого элемента массива.
Страница 4 из 5
Пригласительный этап всероcсийской олимпиады по информатике для 8–10 классов
29-30 мая 2025
При фиксированном значении j в качестве начала левого отрезка можно взять любое значение,
не превосходящее i, поэтому для фиксированного j наилучшая сумма, которую можно взять, равна
sum2 и наименьшему из значений sum1, которые возникали до этого. Поэтому будем хранить в
переменной min_sum1 наименьшее из значений sum1, пересчитывая его каждый раз при сдвиге i.
Такое решение имеет сложность O(n).
n = int (input ())
t = int (input ())
d = [ int (input ()) for i in range(n )]
i = 0
j = t + 1
sum1 = sum(d[ i : i+t ])
sum2 = sum(d[ j : j+t ])
min_sum1 = sum1
ans = sum1 + sum2
while j + t < n:
sum1 += d[ i+t ]
sum1 −= d[ i ]
min_sum1 = min(min_sum1, sum1)
i += 1
sum2 += d[ j+t ]
sum2 −= d[ j ]
j += 1
ans = min(ans , min_sum1 + sum2)
print ( ans )
Страница 5 из 5
Используемые формулы
отрезка равен i, то правый отрезок может иметь начальным элементом отрезок с индексом j = i+t+1n = int (input ())t = int (input ())d = [ int (input ()) for i in range(n )]ans = 10∗∗9i = 0
Самопроверка после решения
- Я использовал все данные из условия и не добавил неподтверждённых предположений.
- Каждый переход в рассуждении объяснён правилом, формулой или ранее доказанным фактом.
- Ответ соответствует вопросу, а обозначения и единицы измерения записаны однозначно.
- Я сравнил свой ход решения с разбором и понял причину каждого отличия.
Типичные ошибки
- Пропустить часть условия.
- Сделать вывод без проверки промежуточного шага.
- Записать только ответ без объяснения.