数字矩阵
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;
}