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);
}
}
不忘初心方得始终