Сдача без мелочи

тема: Два указателя · уровень: базовый

Условие

В школьном буфете цены на булочки уже выписаны в список по возрастанию. У тебя есть купюра на сумму X, и ты хочешь купить ровно две булочки так, чтобы отдать деньги в точности без сдачи.

Номера булочек считаются с 1 в том порядке, в котором они стоят в списке.

Если подходящих пар несколько, буфетчица просит назвать пару номеров лексикографически минимальную: сначала минимальный i, а при равенстве — минимальный j.

Формат ввода

Первая строка: два целых числа n и X — количество цен и нужная сумма. Вторая строка: n целых чисел a1, a2, ..., an — цены булочек в неубывающем порядке.

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

Если подходящей пары нет, выведи NO. Иначе выведи YES и на следующей строке два числа i j (1 ≤ i < j ≤ n) — номера булочек, дающие сумму X, причём пара должна быть лексикографически минимальной.

Ограничения

Пример

Ввод:

6 10
1 2 4 6 6 9

Вывод:

YES
1 6

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

Приём: Два указателя на отсортированном массиве

Ключевое наблюдение: цены уже отсортированы. Значит, если взять левую булочку i и правую j, то при увеличении i сумма a[i]+a[j] не уменьшится, а при уменьшении j сумма не увеличится. Это позволяет искать пару за один проход двумя указателями.

Почему работает: мы всегда «двигаем» ту сторону, которая может приблизить сумму к X, и никогда не пропускаем возможное решение, потому что порядок фиксирует направление изменения суммы.

План:

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

Частая ошибка: остановиться на первом s==X и сразу печатать ответ. Из-за повторов (одинаковых цен) это может дать не минимальный j, а задача требует лексикографически минимальную пару (сначала минимальный i, потом минимальный j).

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

Есть 6 цен по возрастанию: 1 2 4 6 6 9. Нужно найти ровно две булочки, чтобы сумма была 10, и вывести их номера (с 1).

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

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

Куда дальше