Когда турист добежит до цели
Условие
В школьной туристической секции устроили челлендж: за несколько дней набрать суммарно хотя бы G метров пробежки.
Каждый день капитан записывает, сколько метров ты пробежал в этот день. Как только суммарная дистанция с начала челленджа станет не меньше G, можно праздновать.
Нужно определить, на какой по счёту день это впервые произойдёт. Если за все дни суммарно не получится — выведи -1.
Формат ввода
В первой строке даны два целых числа n и G — количество дней и цель в метрах. Во второй строке дано n целых чисел a1, a2, ..., an — пробежка по дням.
Формат вывода
Выведи одно целое число — номер первого дня, когда сумма a1 + ... + ai >= G. Если такого дня нет, выведи -1.
Ограничения
1 ≤ n ≤ 20001 ≤ G ≤ 1_000_0001 ≤ ai ≤ 1000
Пример
Ввод:
5 10
1 2 3 4 5
Вывод:
4Как решать — идея подхода
Приём: Накопление суммы (симуляция)
Ключевое наблюдение: нас интересует первый день, когда накопленная сумма a1 + ... + ai стала не меньше G. Значит, достаточно пройти дни по порядку и вести текущий итог — как только он пересёк порог, ответ найден.
Почему работает симуляция: каждый следующий день просто добавляет ai к уже набранному. Никаких перестановок или сложных выборов нет, порядок фиксирован, поэтому «честно считать слева направо» — оптимально и быстрее всего.
План решения:
- Прочитай
nиG. - Заведи переменную
s = 0(сколько метров уже набрано). - Для i от 1 до n:
- прибавь
aiкs(например:s += ai), - если
s >= G, сразу выведиiи закончи. - Если цикл закончился, а
sтак и не достигG, выведи-1.
Сложность: O(n) по времени и O(1) по памяти (можно даже не хранить весь список, если читать числа подряд).
Частая ошибка: перепутать нумерацию дней. В цикле индекс в Python обычно начинается с 0, но в ответе нужен день, начиная с 1, поэтому печатают i + 1 (или используют enumerate(..., start=1)).
Разберись руками
Есть 5 дней и цель 10 метров. Каждый день добавляем пробежку этого дня к общей сумме. Нужно найти первый день, когда общая сумма станет не меньше 10.
- Проиграй по дням. Стартовая сумма = 0. После каждого события напиши новую сумму.
- Цель = 10. На какой по счёту день сумма ВПЕРВЫЕ стала не меньше 10?
Идея: Идём по дням по порядку и ведём «накопленную сумму». После каждого дня проверяем, достигли ли цель. Как только впервые достигли — запоминаем номер этого дня и останавливаемся. Если дошли до конца и ни разу не достигли — ответ -1.
Решить задачу с автопроверкой на Python →
Куда дальше
- С нуля до олимпиады: маршрут — сколько занимает язык, какие приёмы нужны и к какому этапу это ведёт
- Родителям: подготовка бесплатно — сколько стоит репетитор, что даёт бесплатный маршрут и как понять, что ребёнок занимается
- Школьный этап ВсОШ по информатике — как устроен первый этап и план подготовки за четыре недели