Codeforces Round #683 (Div. 2) Problem - B.Numbers Boxs 题解

题目

题目链接

Codeforces Round #683 (Div. 2, by Meet IT) Problem - B.Numbers Boxs

题目大意

给你一个n行m列的矩形网格。每个格子里有一个数值。你可以执行任意次数的如下操作(包括0次)。

  • 选择有共同边的两个格子,将他们的数值都变为相反数。

你可以对一个格子多次操作。

设X为所有格子数值的和,你目的是通过操作找出最大的X。

输入

每个测试包含多个测试情况。第一行包含了一个数字t(1<=t<=100)表示测试情况数量。

每个测试情况的第一行包含两个数字n,m。(2<=n,m<=10)。

接下来的n行每行包含m个整数。每个整数a(-100<=a<=100)。

输出

对于每个测试情况,输出最大的X。

输入样例

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

输出样例

2
30

题解

刚开始考虑bfs和dfs,但我还没学(没复习)。一看本房间的,好家伙,都做出来了,我就晓得这题我考虑复杂了。

最后通过思考我悟了。

如果有偶数个负数,那么负数就能互相翻转成正数,结果直接相加就是了。

如果有奇数个负数,那么表格中总会存在一个负数,只要让这个负数的绝对值最小就是了。

如果有0,那么肯定能让其他数都变为正数。

Then show the code.

// Problem - B.Numbers Boxs
#include <stdio.h>

int sum, cnt1, cnt2;

int abs(int a){
    return a>=0 ? a : -a;
}

int main(){
    int t, m, n, temp, min;
    scanf("%d", &t);
    while(t--){
        scanf("%d%d", &m, &n);
        sum = cnt1 = cnt2 = 0;
        min = 99999;
        for(int i=0; i<m; i++)
            for(int j=0; j<n; j++){
                scanf("%d", &temp);
                if(temp < 0){
                    cnt1++;
                    temp = -temp;
                }else if(temp == 0)
                    cnt2++;
                if(temp < min)
                    min = temp;
                sum += temp;
            }

        if(cnt2) printf("%d\n", sum);
        else if(cnt1%2 == 0) printf("%d\n", sum);
        else printf("%d\n", sum-2*min);

    }
}
posted @ 2020-11-16 20:19  1v7w  阅读(78)  评论(0编辑  收藏  举报