Шкафчики с почти одинаковыми кодами
Условие
В школе у каждого шкафчика есть числовой код. Завхоз хочет найти два шкафчика с максимально похожими кодами: так проще проверять новые наклейки.
Под «похожестью» он понимает модуль разности кодов. Нужно узнать, какая наименьшая возможная разность получится, если выбрать два разных шкафчика.
Важно: коды могут быть большими по модулю (как 64-битные числа). В Python это не проблема.
Формат ввода
Первая строка: целое число n — количество шкафчиков (2 ≤ n ≤ 8000). Вторая строка: n целых чисел a1, a2, ..., an (-10^9 ≤ ai ≤ 10^9).
Формат вывода
Выведите одно целое число — минимальное значение |ai - aj| среди всех пар i ≠ j.
Ограничения
2 ≤ n ≤ 35000-10^9 ≤ ai ≤ 10^9- По смыслу задачи числа могут выходить за 32-битный тип, ориентируйтесь на 64-битный.
Пример
Ввод:
5
10 3 21 8 14
Вывод:
2Как решать — идея подхода
Приём: Сортировка + минимум среди соседей
Ключевое наблюдение: если числа отсортировать, то для любого элемента его «самый похожий» кандидат находится рядом. Почему? Между двумя не соседними числами в отсортированном списке есть хотя бы одно число посередине, а значит их разность не меньше разности какой-то соседней пары. Поэтому минимальный |ai - aj| всегда достигается на соседях после сортировки.
Приём: сортировка превращает поиск по всем парам (это O(n^2)) в один линейный проход по соседям.
План решения:
- Считай
nи массивa. - Отсортируй
aпо возрастанию. - Инициализируй ответ разностью первых двух:
best = a[1] - a[0]. - Пройди
iот 1 доn-1и обновляйbest = min(best, a[i] - a[i-1]). - Выведи
best.
Мини-сниппет формулы (после сортировки): d = a[i] - a[i-1].
Сложность: сортировка O(n log n), проход O(n), память O(n).
Частая ошибка: пытаться проверять все пары (не пройдёт по времени) или забыть отсортировать и сравнивать «соседей во входе» — это не то же самое.
Разберись руками
Есть 5 шкафчиков с кодами: 10, 3, 21, 8, 14. Нужно выбрать два разных кода так, чтобы модуль разности был как можно меньше.
- Для начала сделай «в лоб»: посмотри на все пары и выбери ту, где |разность| самая маленькая. (Подсказка: разность — это «на сколько отличаются», всегда берём по модулю.)
- Теперь отметь эти коды на числовой ленте (как будто ты их «отсортировал», просто разложив слева направо по возрастанию).
- Посмотри только на СОСЕДНИЕ отмеченные числа на ленте и посчитай расстояния между ними: (8−3), (10−8), (14−10), (21−14). Какое из этих расстояний самое маленькое?
Идея: Если разложить все коды по возрастанию, то самые похожие окажутся среди соседних в этом порядке. Дальше достаточно сравнить разности только между соседними и взять самую маленькую.
Решить задачу с автопроверкой на Python →
Куда дальше
- С нуля до олимпиады: маршрут — сколько занимает язык, какие приёмы нужны и к какому этапу это ведёт
- Перечневые олимпиады по информатике — олимпиады перечня Минобрнауки, их уровни и что нужно к диплому
- БВИ по олимпиадам: в какие вузы берут — правила приёма вузов, разобранные построчно, со ссылкой на приказ у каждой строки