Dada uma matriz quadrada de tamanho n x n. O número mínimo de operações é necessário para que a soma dos elementos em cada linha e coluna se torne igual. Em uma operação, incremente qualquer valor de célula de matriz em 1. Na operação mínima de impressão de primeira linha necessária e nas próximas linhas 'n' imprima números inteiros representando a matriz final após a operação.
Entrada:
1 2
3 4
Saída:
4
4 3
3 4
Explicação
- Valor de incremento da célula (0, 0) por 3
- Valor de incremento da célula (0, 1) por 1 Portanto, total de 4 operações são necessárias
Entrada: 9
1 2 3
4 2 3
3 2 1
Saída:
6
2 4 3
4 2 3
3 3 3
Explicação da solução:
A abordagem é simples, vamos supor que maxSumé a soma máxima entre todas as linhas e colunas. Precisamos apenas incrementar algumas células de modo que a soma de qualquer linha ou coluna se torne "maxSum". Digamos que Xi é o número total de operações necessárias para que a soma na linha "i" seja igual a maxSum e Yj seja o número total de operações necessárias para que a soma na coluna "j" seja igual a maxSum. Como Xi = Yj, precisamos trabalhar em qualquer um deles de acordo com a condição.
Para minimizar o Xi, precisamos escolher omáximo de rowSumi e colSumj, pois certamente levará a operação mínima. Depois disso, incremente "i" ou "j" de acordo com a condição satisfeita após o incremento.
Abaixo está a implementação da abordagem acima.
Código da Solução:
// Java Program to Find minimum
// number of operation required
// such that sum of elements on
// each row and column becomes same
import java.io.*;
class GFG {
// Function to find minimum
// operation required
// to make sum of each row
// and column equals
static int findMinOpeartion(int matrix[][],
int n)
{
// Initialize the sumRow[]
// and sumCol[] array to 0
int[] sumRow = new int[n];
int[] sumCol = new int[n];
// Calculate sumRow[] and
// sumCol[] array
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
{
sumRow[i] += matrix[i][j];
sumCol[j] += matrix[i][j];
}
// Find maximum sum value
// in either row or in column
int maxSum = 0;
for (int i = 0; i < n; ++i)
{
maxSum = Math.max(maxSum, sumRow[i]);
maxSum = Math.max(maxSum, sumCol[i]);
}
int count = 0;
for (int i = 0, j = 0; i < n && j < n;)
{
// Find minimum increment
// required in either row
// or column
int diff = Math.min(maxSum - sumRow[i],
maxSum - sumCol[j]);
// Add difference in
// corresponding cell,
// sumRow[] and sumCol[]
// array
matrix[i][j] += diff;
sumRow[i] += diff;
sumCol[j] += diff;
// Update the count
// variable
count += diff;
// If ith row satisfied,
// increment ith value
// for next iteration
if (sumRow[i] == maxSum)
++i;
// If jth column satisfied,
// increment jth value for
// next iteration
if (sumCol[j] == maxSum)
++j;
}
return count;
}
// Utility function to
// print matrix
static void printMatrix(int matrix[][],
int n)
{
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
System.out.print(matrix[i][j] +
" ");
System.out.println();
}
}
/* Driver program */
public static void main(String[] args)
{
int matrix[][] = {{1, 2},
{3, 4}};
System.out.println(findMinOpeartion(matrix, 2));
printMatrix(matrix, 2);
}
}
// This code is contributed by Gitanjali.
Minha pergunta:
Eu não entendo porque este código funciona com todoscasos. Não é óbvio para mim, por que para resolver o problema eu posso apenas começar do canto superior esquerdo da matriz e resolver avidamente todo o problema, sem verificar o que aconteceria se eu começasse de alguma outra posição como por exemplo o canto inferior esquerdo Quando eu resolvi alguns exemplos de diferentes posições iniciais, eu obtinha uma matriz diferente, mas correta em termos de igualdade de linhas e colunas, mas é uma pequena mágica para mim porque isso está acontecendo. Qualquer sugestão apreciada!
Respostas:
1 para resposta № 1Esse problema pode ser expresso da seguinte maneira.
Suponha que temos n pessoas colhendo morangos,e n cestas. Nosso objetivo é que cada pessoa escolha o mesmo número, e cada cesta tenha o mesmo número (com o número mínimo de morangos extra colhidos.
A matriz A [i, j] representa o número de morangos que a pessoa que coloquei na cesta j.
A ideia é que possamos alcançar esse objetivo simplesmente perguntando a qualquer pessoa que ainda tenha trabalho para colocar um morango em qualquer cesta que não esteja cheia.
isto é não importa qual pessoa ou qual cesta é escolhida, desde que eles ainda tenham espaço. A ordem escolhida no algoritmo fornecido facilita o acompanhamento de quais pessoas e cestas têm espaço.