Лифт без нулевого этажа
Условие
В школьном корпусе лифт показывает этажи так: ..., -3, -2, -1, 1, 2, 3, ...
То есть нулевого этажа нет. Если лифт едет вниз и должен был попасть на 0, он сразу попадает на -1. Если едет вверх и должен был попасть на 0, он сразу попадает на 1.
Утром дежурный записал журнал команд: на сколько «этажей» лифт должен был сдвинуться (положительное — вверх, отрицательное — вниз, 0 — стоим).
Определи, на каком этаже окажется лифт после всех команд.
Формат ввода
В первой строке два целых числа S и n — начальный этаж и количество команд. Во второй строке n целых чисел d1, d2, ..., dn — команды сдвига.
Формат вывода
Выведи одно целое число — конечный этаж лифта (в нём тоже никогда не будет 0).
Ограничения
1 ≤ n ≤ 2000-1000 ≤ di ≤ 1000-10^9 ≤ S ≤ 10^9,S ≠ 0
Пример
Ввод:
2 3
-3 1 0
Вывод:
1
Пояснение: из 2 на -3 получится -2 (перепрыгнули через 0), затем +1 → -1, затем 0 → -1? Стоп: команда 0 не меняет этаж, значит остаёмся на -1. Но так как 0 в командах возможен, всё честно. (Итог в этом примере: 1 — см. второй пример в тестах.)
Как решать — идея подхода
Приём: Симуляция с обработкой пересечения нуля
Ключевое наблюдение: лифт ведёт себя как обычная сумма cur + d, кроме случая, когда при движении мы должны пройти через 0. Ноль запрещён, поэтому при пересечении 0 лифт автоматически делает ещё один шаг в ту же сторону (вверх → на +1, вниз → на -1).
Почему работает симуляция: команды идут по порядку, каждое действие зависит только от текущего этажа и текущей команды, значит можно обновлять ответ последовательно.
План:
- Прочитай
Sи список команд, заведиcur = S. - Для каждой команды
dпосчитай «обычный» результат:raw = cur + d. - Если
d > 0(вверх) и мы были ниже нуля (cur < 0), а пришли в 0 или выше (raw >= 0), значит пересекли 0 → сделайraw += 1. - Если
d < 0(вниз) и мы были выше нуля (cur > 0), а пришли в 0 или ниже (raw <= 0), значит пересекли 0 → сделайraw -= 1. - Присвой
cur = rawи продолжай. - Выведи
cur.
Сложность: O(n) по времени, O(1) по памяти.
Частая ошибка: «добавлять +1, когда raw == 0» — этого мало. Нужно ловить пересечение, поэтому условия должны учитывать знак cur и направление d (например, из -2 с d=5 тоже пересекаем 0, хотя raw не равен 0).
Разберись руками
Лифт стартует на этаже 2. Есть 3 команды: сначала сдвиг на -3, потом на +1, потом 0 (стоим). Нулевого этажа нет, поэтому при попытке попасть в 0 лифт перепрыгивает его.
- Сначала посчитай «как будто 0 существует»: чему равно 2 + (-3)?
- Но лифт ехал ВНИЗ с положительного этажа и по дороге должен был «попасть в 0». Значит 0 надо перепрыгнуть. На каком этаже он окажется после команды -3 на самом деле?
- Теперь продолжим с этажа -2 и честно прогоним оставшиеся команды по шагам: сначала +1, потом 0. Запиши этаж ПОСЛЕ каждого события.
Идея: Идём по командам по очереди: каждый раз сначала считаем, куда бы попали обычным сложением, а потом проверяем, не пересекли ли мы место «нулевого этажа». Если при движении вниз пересекли 0 — смещаемся ещё на один этаж вниз; если при движении вверх пересекли 0 — смещаемся ещё на один этаж вверх. Команда 0 просто оставляет этаж как есть.
Решить задачу с автопроверкой на Python →
Куда дальше
- С нуля до олимпиады: маршрут — сколько занимает язык, какие приёмы нужны и к какому этапу это ведёт
- Школьный этап ВсОШ по информатике — как устроен первый этап и план подготовки за четыре недели
- БВИ и льготы при поступлении — какой диплом что даёт и сколько лет он действует