数字矩阵

数字矩阵

AcWing 3763
思维题
https://www.acwing.com/problem/content/3766/

我们可以把给矩阵相邻元素都乘-1记为一次操作,我们发现对任意一元素,先和它左边相邻元素操作,再和它下边相邻元素操作。它自己正负不变,而左边和下边元素改变。
这样我们推广下去,矩阵任意两个元素都可进行一次操作。
所以我们统计负号的数量:
如果是偶数,则矩阵所有数都可为正。
如果是奇数,则把矩阵中绝对值最小的数变作负数。

代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>


using namespace std;
int sum,cnt,Min;

int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        int n,m;
        cin >> n >> m;
        
        sum = 0;cnt = 0;Min = 101;
        for (int i = 0; i < n; i ++ )
            for (int j = 0; j < m; j ++ )
            {
                int x;
                cin >> x;
                if (x < 0) cnt ++;
                if (abs(x) < Min)
                {
                    Min = abs(x);
                }
                sum += abs(x);
            }
        
        //cout <<"sum:" <<sum << endl;
        //cout << Min << endl;
        
        if (cnt % 2 == 0)
            cout << sum << endl;
        else
            cout << sum - 2*Min << endl;
    }
    return 0;
}

数字矩阵

上一篇:第六篇 大数据Hadoop


下一篇:P5905【模板】Johnson 全源最短路 题解