Батарейка героя
Условие
В игре у героя есть батарейка ёмкости C. В начале она полностью заряжена.
Дальше происходит n событий. Каждое событие меняет заряд на число d_i:
- если
d_iотрицательное — это расход энергии; - если
d_iположительное — это подзарядка.
После каждого события заряд не может превышать C (лишняя энергия «пропадает»). Если после события заряд стал 0 или меньше — батарейка разрядилась, и игра заканчивается прямо на этом событии.
Нужно определить, на каком по счёту событии игра закончится. Если батарейки хватит на все события — вывести 0.
Формат ввода
В первой строке записаны два целых числа n и C. Во второй строке записаны n целых чисел d_1, d_2, ..., d_n.
Формат вывода
Выведите одно целое число — номер события, на котором батарейка разрядится (нумерация с 1), либо 0, если этого не случится.
Ограничения
1 ≤ n ≤ 20001 ≤ C ≤ 1_000_000-1000 ≤ d_i ≤ 1000
Пример
Ввод:
5 10
-3 -4 2 -6 -1
Вывод:
4Как решать — идея подхода
Приём: Линейная симуляция
Ключевое наблюдение: каждое событие влияет только на текущий заряд, а ограничение заряд ≤ C действует сразу после изменения. Значит, ничего «умнее» хранить не нужно — достаточно честно симулировать процесс слева направо.
Почему работает симуляция: правило одинаковое для каждого шага, и момент окончания игры определяется первым событием, после которого заряд стал <= 0. Это именно «первое нарушение», его удобно ловить во время прохода.
План решения:
- Считай
n,Cи массив измененийd[1..n]. - Заведи переменную
b = C(текущий заряд). - Для
iот 1 доn: - Обнови заряд:
b += d[i]. - Если заряд стал больше ёмкости, обрежь сверху:
b = min(b, C). - Если
b <= 0, сразу выведиiи остановись. - Если прошли все события и ни разу не разрядились — выведи
0.
Мини-сниппет для шага: b += d[i] b = min(b, C)
Сложность: O(n) по времени и O(1) по памяти.
Частая ошибка: проверять b <= 0 до обрезки min(b, C) или вообще забыть про обрезку сверху. По условию лишняя энергия пропадает сразу после события, поэтому порядок важен: сначала прибавили d[i], потом ограничили сверху, и только затем проверяем разряд (хотя для <=0 обрезка не спасает, привычка к правильному порядку убережёт от похожих задач).
Разберись руками
Ёмкость батарейки 10, в начале заряд тоже 10. Потом идут изменения заряда: -3, -4, +2, -6, -1. Нужно понять, на каком событии заряд станет 0 или меньше (тогда игра сразу заканчивается).
- Правило «лишняя энергия пропадает»: если после события заряд стал 12, а ёмкость 10, какой заряд считаем дальше?
- Проиграем события по порядку. Стартовый заряд: 10. После каждого события запиши заряд (и помни про «обрезку» сверху до 10).
- На каком по счёту событии игра закончится в этом примере? (Если бы хватило на все 5 событий — ответ был бы 0.)
Идея: Идём по событиям по одному и каждый раз руками обновляем заряд: прибавляем изменение, если заряд стал больше ёмкости — считаем его равным ёмкости, а если заряд стал 0 или меньше — сразу останавливаемся и запоминаем номер этого события. Если дошли до конца и разряда не было — ответ 0.
Решить задачу с автопроверкой на Python →
Куда дальше
- С нуля до олимпиады: маршрут — сколько занимает язык, какие приёмы нужны и к какому этапу это ведёт
- Школьный этап ВсОШ по информатике — как устроен первый этап и план подготовки за четыре недели
- БВИ и льготы при поступлении — какой диплом что даёт и сколько лет он действует