hihocoder-1615-矩阵游戏II
hihocoder-1615-矩阵游戏II
#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
贪心算法
将最小两两的迭加,如果为负为取相反,如果为正则相加。
#include <cstdio>
#include <cstring>
#include <cstdlib>
const int MAXN = 200 + 10;
int n, mp[MAXN][MAXN], a[MAXN];
int cmp(const void *a, const void *b){
return (*(int *)a - *(int *)b);
}
int main(){
freopen("in.txt", "r", stdin);
int ans;
while(scanf("%d", &n) != EOF){
memset(a, 0, sizeof(a));
for(int i=0; i<n; ++i){
for(int j=0; j<n; ++j){
scanf("%d", &mp[i][j]);
a[j] += mp[i][j];
}
}
ans = 0;
qsort(a, n, sizeof(a[0]), cmp);
int i = 0;
while(i + 1 < n && a[i] < 0){
if( a[i+1] + a[i] < 0 ){
ans -= (a[i] + a[i+1]);
}else{
ans += (a[i] + a[i+1]);
}
i = i + 2;
}
for( ; i<n; ++i){
ans += a[i];
}
printf("%d\n", ans );
}
return 0;
}

浙公网安备 33010602011771号