Пусть n - количество чисел в массиве. Если n - нечетное, то оставляем без пары самое "популярное*" число в массиве, удаляем его из массива и уменьшаем размер массива на 1.
Пусть k - сколько раз самое "популярное" число встречается в измененном массиве. Рассмотрим два случая:
- k ≥ n - k (количество "популярного" числа больше или равно количества всех остальных чисел).
В этом случае мы будем собирать в пары "популярное" число с не популярным. Таким образом, соберем (n-k) пар.
- k < n - k (количество "популярного" числа меньше количества всех остальных чисел).
В этом случае мы сможем собрать все пары (n / 2). Чтобы это сделать, можно, например, собирать пары чисел, которых больше всего в массиве. Заметим, что у нас сохраняется на каждом шаге правило, что "популярное" число меньше, чем все остальные. Если мы вдруг не сможем взять никакое из оставшихся чисел, то значит у нас в какой-то момент времени осталась кучка из хотя бы 2 "популярных" чисел, что больше, чем количество остальных. Противоречие. Значит, мы сможем брать числа пока они не кончатся, и, получается, что ответ - половина всех чисел.
*Популярным я назвал число, которые встречается чаще других в массиве.
Нажмите, чтобы раскрыть...
k < n - k инвариант не сохраняется
11133355
113355
1355 (ой)
надо хотя бы k <= n - k
и изымать пару надо из больших групп
тогда вроде после вынесения пары
веса изменятся так
k_i’ = k_i - 1
k_j’ = k_j - 1
n’ = n - 2
k_z’ = k_z
для k_i, k_j всё замечательно, инвариант сохраняется
не понятно что с остальными группами
Лемма: дляk_z всегда выполнено 2*(k_z + 1) <= n
ну в самом деле заметим, что n >= 4
для двух просто нет никаких третьих групп утверждение само собой выполнилось
допустим k_i <= k_j <= k_z
где z это все кроме i, j
рассмотрим случай k_i = 1
так как k_i — максимум, то и так всё очевидно 2*(k_z + 1) <= 4 <= n
но тогда в оставшихся случаях: k_i >= 2
k_i + k_z + k_j <= sum(k_t) = n
k_i + 2 * k_z <= n
2(k_z + 1) <= n
ну и всё:
по лемме у нас всегда выполнен инвариант
k_t <= n - k_t
когда мы извлекаем пару из двух самых больших групп
алгос тогда за n log n в тупую
точно делается любым деревом поиска
или даже кучей можно, еще тупее:
извлекаешь 2 максимума (массивы с ключом их размера)
достаешь пару, возвращаешь их на место
прикольно кстати, максимальный парсоч для графов дополнений за O(n log n) решился, это весьма шустро