Батарейка героя

тема: Моделирование процессов · уровень: базовый

Условие

В игре у героя есть батарейка ёмкости C. В начале она полностью заряжена.

Дальше происходит n событий. Каждое событие меняет заряд на число d_i:

После каждого события заряд не может превышать C (лишняя энергия «пропадает»). Если после события заряд стал 0 или меньше — батарейка разрядилась, и игра заканчивается прямо на этом событии.

Нужно определить, на каком по счёту событии игра закончится. Если батарейки хватит на все события — вывести 0.

Формат ввода

В первой строке записаны два целых числа n и C. Во второй строке записаны n целых чисел d_1, d_2, ..., d_n.

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

Выведите одно целое число — номер события, на котором батарейка разрядится (нумерация с 1), либо 0, если этого не случится.

Ограничения

Пример

Ввод:

5 10
-3 -4 2 -6 -1

Вывод:

4

Как решать — идея подхода

Приём: Линейная симуляция

Ключевое наблюдение: каждое событие влияет только на текущий заряд, а ограничение заряд ≤ C действует сразу после изменения. Значит, ничего «умнее» хранить не нужно — достаточно честно симулировать процесс слева направо.

Почему работает симуляция: правило одинаковое для каждого шага, и момент окончания игры определяется первым событием, после которого заряд стал <= 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 или меньше (тогда игра сразу заканчивается).

Идея: Идём по событиям по одному и каждый раз руками обновляем заряд: прибавляем изменение, если заряд стал больше ёмкости — считаем его равным ёмкости, а если заряд стал 0 или меньше — сразу останавливаемся и запоминаем номер этого события. Если дошли до конца и разряда не было — ответ 0.

Решить задачу с автопроверкой на Python →

Куда дальше