acwing3763 数字矩阵 每日一题

题目描述

给定一个 的整数矩阵,其中第 行第 列的元素为 aij。

你可以进行任意多次如下操作:

选择矩阵中的两个相邻元素,将它们均乘以 −1。

同一个元素可以被选中多次。

你需要通过上述操作,使得矩阵中所有元素的和尽可能大。

计算并输出这个和的最大可能值。

输入格式

T组输入,给定n,m;表示n*m的矩阵

输出格式

输出最大值

样例描述:

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

思路:

开始我的想法是盲猜所有的负数都可以转变成正数,对比样例发现,这种情况只有在,负数为偶数的时候才可以全部变成负数,而奇数的时候,可以看成是偶数+1,所以至少最后都还有一个负数,要让和最大,就让绝对值最小的那个为负数即可。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=10010;
int g[N][N];
int main(){
    int  t;cin>>t;
    while(t--){
        int n,m;
        cin>>n>>m;
        long long ans=0;
        int a,b=0,minn=1e9;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>g[i][j];
                ans+=abs(g[i][j]);
                minn=min(minn,abs(g[i][j]));
                if(g[i][j]<=0) b++;
            }
        }
        if(b&1) cout<<ans-minn*2<<endl;
        else cout<<ans<<endl;
    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
迷茫的大四🐶:都收获五个了,兄弟那还说啥,不用改了,去玩吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务