Давайте рассмотрим одномерный случай: у вас есть массив чисел, и вам разрешена одна операция: возьмите 1 из значения одного из элементов массива и добавьте его к другому элементу. Цель состоит в том, чтобы сделать все элементы равными с минимальными операциями. Здесь решение простое: вы выбираете случайное «слишком большое число» и добавляете одно к случайному «слишком маленькому» числу. Позвольте мне теперь описать, как это связано с рассматриваемой проблемой.
Вы можете легко рассчитать сумму, которая необходима для каждого столбца и каждой строки. Это общая сумма всех элементов в матрице, деленная на количество столбцов или строк соответственно. С этого момента вы можете рассчитать, какие строки и столбцы нужно уменьшить, а какие - увеличить. смотри здесь:
1 1 2 2 -2
1 0 1 1 +1
0 0 1 1 +2
1 1 1 2 -1
+1+2-1-2
Expected sum of a row: 4
Expected sum of a column: 4
Итак, теперь мы генерируем два массива: массив смещений в строках: -2,+1,+2,-1
и количество смещений в столбцах: +1,+2,-1,-2
. Для этих двух массивов мы решаем более простую задачу, описанную выше. Очевидно, что мы не можем решить начальную проблему за меньшее количество шагов, чем те, которые требуются для более простой задачи (иначе баланс в столбцах или строках не будет равен 0).
Однако я докажу, что исходная задача может быть решена ровно за столько же шагов, сколько и максимальное количество шагов, необходимых для решения задачи для столбцов и строк:
Каждый шаг в более простой задаче генерирует два индекса i
и j
: индекс, из которого нужно вычесть, и индекс, к которому нужно добавить. Предположим, что в шаге задачи столбца у нас есть индексы ci
и cj
, а в задаче строки у нас есть индексы ri
и rj
. Затем мы назначаем соответствие этому в первоначальном задании: возьмите 1 из (ci, ri)
и добавьте одно к (cj, rj)
. В определенный момент мы столкнемся с ситуацией, в которой может быть еще больше шагов, скажем, в задаче столбцов, а не в задаче строк. Таким образом, мы получаем ci
и cj
, но что мы делаем для ri
и rj
? Мы просто выбираем ri
= rj
, чтобы не путать вычисления строк.
В этом решении я использую тот факт, что мне разрешено получать отрицательные числа в матрице.
Теперь давайте продемонстрируем:
Solution for columns:
4->1;3->2;4->2
Solution for rows:
1->3;1->3;2->4
Total solution:
(4,1)->(1,3);(3,1)->(2,3);(4,2)->(2,4)