数字矩阵(秋季每日一题 3)

给定一个 n × m n×m n×m 的整数矩阵,其中第 i i i 行第 j j j 列的元素为 a i j a_{ij} aij

你可以进行任意多次如下操作:

选择矩阵中的两个相邻元素,将它们均乘以 − 1 −1 1

同一个元素可以被选中多次。

你需要通过上述操作,使得矩阵中所有元素的和尽可能大。

计算并输出这个和的最大可能值。

输入格式
第一行包含整数 T T T,表示共有 T T T 组测试数据。

每组数据第一行包含两个整数 n , m n,m n,m

接下来 n n n 行,每行包含 m m m 个整数,表示整个矩阵,其中第 i i i 行第 j j j 列的数为 a i j a_{ij} aij

输出格式
每组数据输出一行结果,表示矩阵的所有元素的最大可能和。

数据范围
1 ≤ T ≤ 100 , 1≤T≤100, 1T100,
2 ≤ n , m ≤ 10 , 2≤n,m≤10, 2n,m10,
− 100 ≤ a i j ≤ 100 −100≤a_{ij}≤100 100aij100

输入样例:

2
2 2
-1 1
1 1
3 4
0 -1 -2 -3
-1 -2 -3 -4
-2 -3 -4 -5

输出样例:

2
30

#include

using namespace std;

int main(){
    
    int t;
    cin >> t;
    while(t--){
        
        int n, m;
        cin >> n >> m;
        
        int x;
        int mi = 1e8, sum = 0, cnt = 0;
        for(int i = 0; i < n * m; i++){
            
            cin >> x;
            if(x < 0) cnt++;
            mi = min(mi, abs(x));
            sum += abs(x);
        }
            
        if(cnt % 2) cout << sum - 2 * mi << endl; 
        else cout << sum << endl;
    }
    
    return 0;
}

你可能感兴趣的:(秋季每日一题,思维题)