zoukankan      html  css  js  c++  java
  • 2020-12-7 翻转矩阵后的得分

    题目


    解题思路

    本题的目标是通过多次行或列的反转,以使得数组中各行所表示的二进制数的值之和最大。
    经分析可知,要使和最大,须优先使得列下标值较小的列中1的个数最多。所以得到如下思路:

    1. 通过行反转使得第一列的所有元素均为1(即每行的第一个元素均为1)
    2. 然后遍历除第一列外的每一列,求出每列中1的个数,若其小于行数的一半,便对该列进行反转。
    3. 最后对得到的最佳矩阵求和。

    代码实现

    class Solution {
    public:
        int matrixScore(vector<vector<int>>& A) {
            vector<int> cnt(A[0].size()-1, 0);
    
            // 使每行的第一个元素都变为1
            for (int i = 0; i < A.size(); i++){
                if (A[i][0] == 0)
                    reverseArr(A[i]);
            } 
    
            // 遍历除第一列外的元素,记录各列为1的个数保存入数组cnt
            for (int j = 1; j < A[0].size(); j++){
                for (int i = 0; i < A.size(); i++){
                    if (A[i][j] == 1)
                        cnt[j-1]++;
                }
    			
                if (cnt[j-1] < A.size()/2+1){
                    for (int i = 0; i < A.size(); i++){
                        A[i][j] ^= 1; 
                    }
                    cnt[j-1] = A.size() - cnt[j-1];
                }
            }
    
            // 求和
            int sum = A.size() * pow(2, A[0].size()-1);
            for (int i = 1; i < A[0].size(); i++)
                sum += cnt[i-1] * pow(2, A[0].size()-i-1);
        
            return sum;
        }
    
        void reverseArr(vector<int>& arr){
            for (int i = 0; i < arr.size(); i++)
                arr[i] ^= 1;
        }
    };
    

    提交结果

    CS专业在读,热爱编程。
    专业之外,喜欢阅读,尤爱哲学、金庸、马尔克斯。
  • 相关阅读:
    回老家
    防疫针
    平安夜
    虎威威
    圣诞联欢会
    小老虎飞船
    电子积木
    打印
    周日大悦城
    又一年毕业季
  • 原文地址:https://www.cnblogs.com/jmhwsrr/p/14099354.html
Copyright © 2011-2022 走看看