Хорошо, я предполагаю, что мы хотим минимизировать сумму различий по всем группам.
Давайте сортировать цифры. Существует оптимальный ответ, где каждая группа является последовательным сегментом в отсортированном массиве (доказательство: пусть A1 < B1 < A2 < B2. Мы можем обменять A2 и B1. Ответ не будет увеличиваться).
Пусть a [l], a [l + 1], ..., a [r] - группа. Это стоит a[r] - a[l] = (a[r] - a[r - 1]) + (a[r - 1] - a[r - 2]) + ... + (a[l + 1] - a[l])
. Это приводит нас к ключевому пониманию: k
групп k - 1
пробелов и ответ a[n - 1] - a[0] - sum of gaps
. Таким образом, нам просто нужно максимизировать пробелы.
Вот окончательное решение:
- сортировать массив
- Compute различия между соседними числами
- принимают
k - 1
наибольшие различия. Именно там группируются группы.
- Мы можем найти
k-1
самый большой элемент в линейном времени (или если мы в порядке с O(N log N)
раз, мы можем просто отсортировать их). Вот и все.
Вот пример:
x = [1, 1, 4, 3], k = 2
отсортирован: [1, 1, 3, 4]
различия: [0, 2, 1]
принимая k - 1 = 1
самые большие пробелы: это 2. Таким образом, группы [1, 1]
и [3, 4]
.
Чуть более надуманный один:
x = [8, 2, 0, 3], k = 3
отсортирован: [0, 2, 3, 8]
различия: [2, 1, 5]
принимая k - 1 = 2
самые большие пробелы: они 2 и 5. Таким образом, группы [0], [2, 3], [8]
с общей стоимостью 1.
Диапазон параметров. – TurtleIzzy
Что произойдет, если вы их отсортируете? что произойдет, если n% k не равно 0? может ли группа быть меньше, чем k? – yd1
Группа должна быть непустой. Это означает, что у него будет> = 1 элемент – bolzano