Задача С. Турнир из ВКОШП

C. Турнир

ограничение по времени на тест: 1 секунда

ограничение по памяти на тест: 512 мегабайт

ввод: стандартный ввод

вывод: стандартный вывод

В лингвистической игре «Шляпа» могут принимать участие несколько пар игроков. Также в игре должен быть ведущий.

Учитель планирует организовать турнир по «Шляпе» в своем классе, в котором учатся nn школьников, nn нечетно. Для этого он хочет разбить школьников на пары, а тот, кто останется без пары — будет ведущим.

Пронумеруем школьников целыми числами от 1 до n. Для i-го школьника известен его уровень игры в «Шляпу» — целое число a_i. Уровень игры пары равен сумме уровней игры входящих в нее двух школьников.

Чтобы турнир был как можно более справедливым, учитель хочет, чтобы разность между максимальным и минимальным уровнями получившихся пар была как можно меньше. Помогите учителю выбрать ведущего и составить из оставшихся n−1 школьников пары так, чтобы добиться поставленной цели.

Входные данные
Первая строка входных данных содержится целое число n — число учеников в классе (3≤n≤5⋅10^5, гарантируется, что n нечетно).

Вторая строка содержит n целых чисел a1,a2,…,an (1≤ai≤10^9).

Выходные данные
Выведите одно число — минимальную возможную разность между максимальным и минимальным уровнем пар в турнире.

Пример
входные данные
5
1 2 3 5 9
выходные данные
1

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

1 лайк

Как именно ты это делаешь?

1 лайк

К примеру
9
1 3 4 6 9 13 14 16 17
(Сортируем массив)
Допустим за ведущего я взял 17 тогда оптимально будет взять пары 1 16, 3 14, 4 13, 6 9
то есть ставлю указатель на минимум и максимум (не учитывая ведущего) затем l и r это и будет одной из пар, увеличивая l на один и уменьшая r на один. Если я попал в своего ведущего тогда скипаю его
Посчитав разницей будет 2

Отсортируй массив изначально и посмотри какие пары будут при выборе i-го человека как ведущего.

1 лайк

я же так и сделал

Посмотри когда выбираешь i-го человека какие пары будут, как можно быстро брать минимум среди этих пар?

1 лайк

Типо с перебором можно как то быстро пересчитывать эти минимальные и максимальные пары?

Заранее попробуй посчитать что-то и из этого что-то собери ответ для случая где i человек ведущий.

1 лайк

Походу я тупой…

Подсказка 1

Рассмотрим сначала задачу, где n - четно, а выбора ведущего у нас нет. Отсортируем изначальный массив. Как оптимально распределить пары школьников?

Ответ

Самым оптимальным путем распределения - группировать меньшие числа с большими. То есть, a[1] + a[n], a[2] + a[n - 1], ...

Подсказка 2

Вернемся к исходной задаче. Что произойдет с оптимальным распределением пар, при выборе i-того школьника как ведущего?

Ответ

Рассмотрим на примере. Пусть ведущим будет школьник 1. Если снова распределить пары школьников оптимально, не включая в массив ведущего, то у нас будут пары вида a[2] + a[n], a[3] + a[n - 1], .... При ведущим под номером 2, распределение будет таковым: a[1] + a[n], a[3] + a[n - 1], ....

Детали по коду

Все суммы пар будем хранить в multiset. Начнем перебирать ведущих. Мы знаем, что первым ведущим будет 1, так что заранее занесем в мультимножество a[2] + a[n], a[3] + a[n - 1], .... После начнем перебор ведущих с 2. Из мультисета удалим пару a[2] + a[n], т.к. 2 является ведущим и добавим a[1] + a[n]. Возьмем из мультимножества максимальный и минимальный элемент, и обновим ответ, если разницa max - min будет меньше предыдущих.

4 лайка