zoukankan      html  css  js  c++  java
  • 861. 翻转矩阵后的得分

    有一个二维矩阵 A 其中每个元素的值为 0 或 1 。

    移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0。

    在做出任意次数的移动后,将该矩阵的每一行都按照二进制数来解释,矩阵的得分就是这些数字的总和。

    返回尽可能高的分数。

    示例:

    输入:[[0,0,1,1],[1,0,1,0],[1,1,0,0]]
    输出:39
    解释:
    转换为 [[1,1,1,1],[1,0,0,1],[1,1,1,1]]
    0b1111 + 0b1001 + 0b1111 = 15 + 9 + 15 = 39
     

    提示:

    1 <= A.length <= 20
    1 <= A[0].length <= 20
    A[i][j] 是 0 或 1

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/score-after-flipping-matrix
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 class Solution {
     4 public:
     5     //贪心思想 
     6     //若每行的第一个数都是1 才会得分最高
     7     //所以先贪心每行的第一位数 都让它为1
     8     //此时就不能改变行了 因为改变行会导致第一位不为1
     9     //接着从第二列开始贪心列 使得每一列的1的个数最多
    10     void inverseRow(vector<vector<int>>& A, int row)//翻转行
    11     {
    12         int col_size = A[0].size();
    13         for (int j = 0; j < col_size; j++)
    14             A[row][j] = A[row][j] ^ 1;
    15     }
    16     void inverseCol(vector<vector<int>>& A, int col)//翻转列
    17     {
    18         int row_size = A.size();
    19         for (int i = 0; i < row_size; i++)
    20             A[i][col] = A[i][col] ^ 1;
    21     }
    22     int computeRes(vector<vector<int>>& A)//计算结果
    23     {
    24         int res = 0;
    25         int row = A.size(), col = A[0].size();
    26         int temp = 0;
    27         for (int i = 0; i < row; i++)//计算每一行
    28         {
    29             temp = 0;//每一行的二进制值
    30             for (int j = 0; j < col; j++)
    31                 temp = temp * 2 + A[i][j];
    32             res += temp;
    33         }
    34         return res;
    35     }
    36     int matrixScore(vector<vector<int>>& A) {
    37         int row = A.size(), col = A[0].size();
    38         for (int i = 0; i < row; i++)if (!A[i][0])inverseRow(A, i);//对第一列进行贪心 翻转每行 使得第一列为全1
    39         int count_1;
    40         for (int j = 1; j < col; j++)//对之后的每一列进行贪心 翻转列
    41         {
    42             count_1 = 0;//记录当前列为1的个数
    43             for (int i = 0; i < row; i++)if (A[i][j])count_1++;
    44             if (count_1 <= row / 2)inverseCol(A, j);//若为1的个数小于行数的一半 则需要列翻转
    45         }
    46         return computeRes(A);
    47     }
    48 };
    49 int main()
    50 {
    51     int m, n, temp, data;
    52     cin >> m >> n;
    53     vector<vector<int>> A;
    54     while (m--)
    55     {
    56         temp = n;
    57         vector<int> v;
    58         while (temp--)
    59         {
    60             cin >> data;
    61             v.push_back(data);
    62         }
    63         A.push_back(v);
    64     }
    65     cout << Solution().matrixScore(A);
    66     return 0;
    67 }
  • 相关阅读:
    【译】使用自定义ViewHelper来简化Asp.net MVC view的开发part5(完)
    【译】使用自定义ViewHelper来简化Asp.net MVC view的开发part1
    【译】使用自定义ViewHelper来简化Asp.net MVC view的开发part3
    开发者分享在PC上制作iOS游戏的经验(上)
    dpi和ppi是什么意思
    Go语言
    逆向思维魔兽世界封包分析(2)
    关于手机游戏的部分情况调查
    《Android Dev Guide》系列教程1:什么是Android?
    拼包函数及网络封包的异常处理(含代码)
  • 原文地址:https://www.cnblogs.com/lancelee98/p/13288105.html
Copyright © 2011-2022 走看看