给定类型的最小运算,以使矩阵的所有元素在C ++中相等

问题陈述

给定一个整数K和一个M x N的矩阵,任务是找到使矩阵的所有元素相等所需的最小操作数。在单个操作中,可以将K添加到矩阵的任何元素或从中减去。

示例

If input matrix is:

{

   {2, 4},

   {20, 40}

} and K = 2 then total 27 operations required as follows;

Matrix[0][0] = 2 + (K * 9) = 20 = 9 operations

Matrix[0][1] = 4 + (k * 8) = 20 = 8 operations

Matrix[1][0] = 20 + (k * 10) = 40 = 10 operations

算法

1. Since we are only allowed to add or subtract K from any element, we can easily infer that mod of all the elements with K should be equal. If it’s not, then return -1

2. sort all the elements of the matrix in non-deceasing order and find the median of the sorted elements

3. The minimum number of steps would occur if we convert all the elements equal to the median

示例

#include <bits/stdc++.h>

using namespace std;

int getMinOperations(int n, int m, int k, vector<vector<int> >& matrix) {

   vector<int> arr(n * m, 0);

   int mod = matrix[0][0] % k;

   for (int i = 0; i < n; ++i) {

      for (int j = 0; j < m; ++j) {

         arr[i * m + j] = matrix[i][j];

            if (matrix[i][j] % k != mod) {

               return -1;

            }

      }

   }

   sort(arr.begin(), arr.end());

   int median = arr[(n * m) / 2];

   int minOperations = 0;

   for (int i = 0; i < n * m; ++i)

      minOperations += abs(arr[i] - median) / k;

   if ((n * m) % 2 == 0) {

      int newMedian = arr[(n * m) / 2];

      int newMinOperations = 0;

      for (int i = 0; i < n * m; ++i)

         newMinOperations += abs(arr[i] - newMedian) / k;

      minOperations = min(minOperations, newMinOperations);

   }

   return minOperations;

}

int main() {

   vector<vector<int> > matrix = {

      { 2, 4},

      { 20, 40},

   };

   int n = matrix.size();

   int m = matrix[0].size();

   int k = 2;

   cout << "Minimum required operations = " <<

   getMinOperations(n, m, k, matrix) << endl;

   return 0;

}

当您编译并执行上述程序时。它产生以下输出

输出结果

Minimum required operations = 27

以上是 给定类型的最小运算,以使矩阵的所有元素在C ++中相等 的全部内容, 来源链接: utcz.com/z/360336.html

回到顶部