这是 一道acwing的暑假每日一题。(留好出处,大家可以去官网看更多题解)
先说一下这道题的有趣的地方,看起来可能很难,毫无头绪,其实他是一个脑筋急转弯问题。
这里说一下核心,如何处理这个正负问题,他可给任意相邻的数变为原来的相反数,那么只需要统计一下负数和0的个数,我们用pan来表示,如果pan 是一个偶数,那么说明 我们他全是可以变为正数的,我们只要读入数据的时候,对每一个的绝对值进行累加就可以了,如果是奇数,那么问题来了,多的一个数怎么办呢,我们又引入了一个新的 变量 q 来存储 读入数据的绝对值的最小值,奇数,那么一定有一个是负的,我们把这个最小的设置负的,就可以保证整体的最大值,(之前的累加已经加了一个q进去),所以我们要对累加的数减去两个q,这样就可以输出了。
看代码:
//主要是一个思维题 核心在于 奇偶判断
#include <bits/stdc++.h>
using namespace std;
int t,n,m; //读入 数据组数 行和列
int a;
int sum;
int q=1000;
int pan=0;
int main()
{
cin >>t;
for(int i=0; i<t; i++){
cin >> n >>m;
pan=0; //这三行 重置数据
sum=0;
pan=1000;
for(int j=0; j<n; j++){
for(int k=0; k<m; k++){
cin >> a;
if(a<=0) pan++; //判断非正数奇偶
sum+=abs(a); //所有的和
q=min(q,abs(a)); //最小值
}
}
// printf(" %d ",sum);
if(pan%2==0) cout<<sum<<endl; //偶数 那么直接是所有绝对值的和
else cout<< sum-2*q<<endl; //奇数 那么有一个负的 保证他是最小值即可 因为之前我们的sum多加了一个q 所以这里要减去两个q
}
return 0;
}