CF1447B Numbers Box
题目链接:https://codeforces.com/problemset/problem/1447/B
题目大意:
给一个n×m的矩阵,可进行m次操作(m无限制),每次操作可以选则两个相邻的格子(相邻即为有公共边),将这两个格子内的元素都乘上-1,问最终这个矩阵内所有元素的和最大是多少。
解题思路:
读入元素的时候,记录0和负数的个数X,注意虽然两个负数可能不相邻,但是任然可以将这两个负数都变为正数,方法就是在他俩的路径上不断进行题中所说的操作。所以最后如果X是偶数,则最大的和就是所有元素的绝对值的和,如果X是奇数,则最后必定留有一个数是负数(也有可能是0),所以选择所有元素的绝对值最小的,减去即可。
参考代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <algorithm> 5 #include <cmath> 6 #define N 20 7 using namespace std; 8 int mp[N][N]; 9 int main() 10 { 11 vector<int> v; 12 int t,n,m; 13 scanf("%d",&t); 14 while(t--) 15 { 16 v.clear(); 17 scanf("%d%d",&n,&m); 18 int X = 0; 19 int sum = 0; 20 for(int i = 1; i <= n; i++) 21 { 22 for(int j = 1; j <= m; j++) 23 { 24 scanf("%d",&mp[i][j]); 25 if(mp[i][j] < 0) sum += abs(mp[i][j]); 26 else sum += mp[i][j]; 27 if(mp[i][j] <= 0) X++; 28 v.push_back(abs(mp[i][j])); 29 } 30 } 31 sort(v.begin(),v.end()); 32 if(X % 2 == 0) printf("%d\n",sum); 33 else { 34 sum -= 2*v[0]; 35 printf("%d\n",sum); 36 } 37 } 38 return 0; 39 }

浙公网安备 33010602011771号