Точка равновесия на стадионе

тема: Префиксные суммы · уровень: базовый

Условие

На школьном стадионе тренер раскладывает вдоль дорожки таблички с числами — это «баллы нагрузки» на каждом отрезке круга.

Тренер хочет найти такое место разреза после некоторого отрезка, чтобы сумма баллов слева (от начала до этого места) ровно совпала с суммой баллов справа (от следующего отрезка до конца).

Найди самый ранний (с наименьшим номером) разрез, где это получается.

Формат ввода

Разрез после i означает, что слева стоят элементы a1..ai, а справа — a(i+1)..an.

Формат вывода Выведи одно целое число — минимальный i (1 ≤ i ≤ n-1), для которого a1 + ... + ai = a(i+1) + ... + an. Если такого i нет, выведи -1.

Ограничения

Пример Ввод:

5
1 2 3 3 9

Вывод:

4

После 4-го отрезка слева сумма 1+2+3+3=9, справа сумма 9 — равенство выполнено.

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

Приём: Префиксная сумма + общая сумма

Ключевое наблюдение: пересчитывать сумму справа каждый раз не нужно. Если известна общая сумма total, то сумма справа после разреза i равна total - left, где left — сумма a1..ai. Тогда условие равновесия — это просто left == total - left.

Почему это работает: при проходе по массиву мы поддерживаем одну переменную left (префиксную сумму) и за O(1) узнаём правую часть. Получаем линейное решение вместо квадратичного.

План:

Сниппет-формула: right = total - left.

Сложность: O(n) по времени и O(1) по памяти (если не считать сам массив).

Частая ошибка: проверять разрез после n (справа пусто) или забыть, что нужен i в диапазоне 1..n-1. Ещё одна грабля — путаница индексов: в коде чаще a[i-1], а выводить нужно человеческий i.

Разберись руками

Есть 5 отрезков с баллами: 1, 2, 3, 3, 9. Разрез после i делит их на левую часть (первые i) и правую часть (оставшиеся). Нужно найти самый ранний разрез, где суммы слева и справа равны.

Идея: Сначала один раз находишь общую сумму всех чисел. Потом идёшь слева направо и ведёшь накопленную сумму. Для каждого разреза справа можно получить сумму как «всё вместе минус то, что слева», и сравнить; первый раз, когда они равны, и есть ответ.

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

Куда дальше