Переупорядочить массив с суммой и длиной n, минимизируя изменение расстояния

Дан массив A[n] (длина n) неотрицательных целых чисел. Массив содержит n объектов, рассредоточенных внутри себя, так что A[i] представляет количество объектов в слоте i, а сумма A[i] от i=0 до n равна n . Мы должны переупорядочить массив так, чтобы каждый элемент был равен 1. Нам дано, что n ‹= 10^5. (Поэтому O(n^2) слишком медленный, но O(n log n) в порядке.)

Перестановка работает следующим образом: если A[i] = k и A[j] = h, то мы можем уменьшить A[i] на некоторое натуральное число m ‹= k и увеличить некоторый элемент A[j] на m соответственно, так что A[i] = k-m и A[j] = h+m. Однако стоимость каждой перестановки определяется выражением Cost(m, i, j) = m d(i, j)^2 (пропорционально квадрату расстояния перестановки). Массив работает таким образом, что функция расстояния d(i, j) представляет собой стандартное вычитание, но может охватывать массив, поэтому, если n = 7, то d(1, 4)=3, но d(0, 6) = 1 и d(1,5) = 3 и т. д. То есть мы можем думать о массиве как о «круговом».

Общая стоимость определяется суммой функции стоимости по всем перестановкам, и наша цель — найти минимальное значение функции стоимости, такое что A[i] = 1 для всех i, т. е. все элементы равны 1. Каждый объект можно переставить только один раз, например, если A = [5,0,0,0,0], мы не можем просто переместить объект из A[0] в A[1], а затем в A[2]. чтобы обойти квадрат расстояния.

Будем признательны за помощь в алгоритме или псевдокоде/коде для решения этой проблемы.


person user5802336    schedule 22.02.2016    source источник
comment
Интересная проблема! Является ли точка O (n ^ 2) vs O (n log n) размером функции стоимости или временем вычислений? Я предполагаю, что у нас в основном есть предел вычислений O (n log n) и мы просто хотим минимизировать функцию стоимости в пределах этой границы, но не могли бы вы уточнить? Кроме того, возведение расстояния в квадрат звучит искусственно, потому что, например. если A = [5, 0, 0, 0, 0], вы могли бы получить [4, 0, 1, 0, 0], вы могли бы просто сделать 2 перестановки по стоимости 2 * 1^2 = 2 вместо выполнения одна перестановка за стоимость 1 * 2 ^ 2 = 4. Таким образом, вы можете эффективно перемещать вещи за Cost (m, i, j) = m * d (i, j)?   -  person voltrevo    schedule 22.02.2016
comment
К сожалению, извините, что квадрат расстояния не был ясен - я хотел сказать, что каждое число можно переместить только один раз, если это имеет смысл. То есть вы можете думать об этом так, как будто в A[0] есть 5 объектов, и каждый объект можно переместить только один раз. Кроме того, O(n log n) является ограничением времени вычислений (поскольку 10^10 вычислений занимают слишком много времени).   -  person user5802336    schedule 22.02.2016
comment
Хммм, похоже, что каждый индекс может быть местом назначения перестановки только один раз. Например. в примере [5, 0, 0, 0, 0] вам нужно будет выполнить четыре операции, которые все исходят из этой ведущей 5, но все эти нули можно превратить только в 1, нельзя поместить больше 1 в их, а затем переместите лишнее позже. Это правильно?   -  person voltrevo    schedule 22.02.2016
comment
Да, это правильно, каждый индекс будет пунктом назначения только один раз. В вашем примере ответ будет 4 + 1 + 4 + 1 = 10 (это затраты на перемещение объекта во 2-й, 3-й, 4-й и 5-й слот соответственно).   -  person user5802336    schedule 22.02.2016
comment
Очень похожий вопрос   -  person Ante    schedule 22.02.2016