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; 
}

  

posted @ 2017-10-30 19:30  zhang--yd  阅读(399)  评论(0编辑  收藏  举报