Конвейер и опасная пара

тема: Сортировки · уровень: средний

Условие

На заводе детали проходят через участок сборки: их нужно разложить по коробкам по две штуки.

Если в одной коробке лежат детали размеров x и y, то «опасность» коробки равна x·y (произведение). За смену инженер смотрит на самую опасную коробку и хочет, чтобы её опасность была как можно меньше.

Твоя задача — понять, как разложить детали по парам, чтобы максимальное произведение в паре было минимальным, и вывести это минимально возможное значение.

Важно: произведения могут не помещаться в 32-битный тип, ориентируйся на 64-битные целые (в Python это не проблема).

Формат ввода

Формат вывода Выведи одно целое число — минимально возможное значение максимального произведения среди всех пар.

Ограничения

Пример Ввод:

4
1 2 3 4

Вывод:

6

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

Приём: Сортировка + жадное спаривание (две указки)

Ключевое наблюдение: нас волнует не сумма и не все произведения, а только самое большое произведение среди пар. Чтобы «приглушить» этот максимум, большие числа нельзя «встречать» друг с другом — иначе одна коробка станет слишком опасной.

Почему работает жадность: после сортировки пусть a[0] <= ... <= a[n-1]. Самый большой элемент a[n-1] в любом разбиении должен быть с кем-то в паре. Если дать ему не самый маленький, а более крупный элемент, произведение только вырастет. Значит, оптимально спарить a[n-1] с a[0]. Тот же аргумент повторяется для оставшихся элементов (обменный аргумент: любую пару с a[n-1] можно «улучшить», заменив партнёра на меньшего, не увеличив максимум).

План решения:

Сложность: сортировка O(N log N), проход двумя указателями O(N), память O(1) сверх массива.

Частая ошибка: пытаться соединять соседние после сортировки (малые с малыми, большие с большими) — это обычно увеличивает максимум. В языках с фиксированными целыми не забудь 64-битный тип для произведения.

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

Есть 4 детали размеров 1, 2, 3, 4. Их нужно разложить по 2 в коробку так, чтобы самая «опасная» коробка (с самым большим произведением размеров) была как можно менее опасной.

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

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

Куда дальше