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 ", ans ); } return 0; }