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 }

 

posted @ 2020-11-16 09:44  不敢说的梦  阅读(165)  评论(0)    收藏  举报