您的位置:首页 > 其它

[hihoCoder]#1615 : 矩阵游戏II

2017-10-29 23:16 309 查看

1615 : 矩阵游戏II

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

给定一个NxN的整数矩阵,小Hi每次操作可以选择两列,将这两列中的所有数变成它的相反数。

小Hi可以进行任意次操作,他的目标是使矩阵中所有数的和尽量大。你能求出最大可能的和吗?

输入

第一行一个整数N。

以下N行,每行N个整数Aij。

对于30%的数据,2 ≤ N ≤ 10

对于100%的数据,2 ≤ N ≤ 200, -1000 ≤ Aij ≤ 1000

输出

最大可能的和

样例输入

4

-1 1 1 2

-2 -3 1 2

-3 -2 1 2

-4 -1 1 2

样例输出

27

解题思路

这个只操作列,就相当于一维数组的操作,只要排好序,两个两个一加,注意好,中间正负相交的是正是负。

注意最后一个不需要任何操作

因为事先不知道数组的大小,所以这里使用了动态数组

AC代码

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
int N;
cin>>N;
int *colTotal = new int
;

int **temp;
temp = new int *
;
for(int i = 0;i < N; ++i)
{
temp[i] = new int
;
}

for (int i = 0; i < N; ++i)
{
for (int j = 0; j < N; ++j)
{
cin >> temp[i][j];
}
}

//将二维数组压缩成一维数组
for(int j = 0;j < N; ++j)
{
colTotal[j]=0;
for(int i = 0;i < N; ++i)
{
colTotal[j] += temp[i][j];
}
}

sort(colTotal,colTotal + N);

int result = 0;
for(int i = 0; i < N
4000
; i += 2)
{
if((i+1) == N)
{

result += colTotal[i];

break;
}

if((colTotal[i] + colTotal[i+1]) >= 0)
{
result +=(colTotal[i]+colTotal[i+1]);
}
else
{
result -=(colTotal[i]+colTotal[i+1]);
}

}

cout << result <<endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: