把每列取反后所能获得的收益记录下来,然后排序,从高到低一对对的取,大于0就算上。
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <stack>
#include <bits/stdc++.h>
using namespace std;
int N;
int F[204][204];
int A[204];
int main(){
cin>>N;
int total=0;
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
scanf("%d",&F[i][j]);
total+=F[i][j];
}
}
for(int j=0;j<N;j++){
int zheng=0;
int fu=0;
for(int i=0;i<N;i++){
zheng+=F[i][j];
fu-=F[i][j];
}
A[j]=fu-zheng;
}
sort(A,A+N);
for(int i=N-1;i>=1;i-=2){
if(A[i]+A[i-1]>0){
total+=A[i]+A[i-1];
}
else break;
}
cout<<total<<endl;
return 0;
}
//
// _oo0oo_
// o8888888o
// 88" . "88
// (| -_- |)
// 0\ = /0
// ___/`---'\___
// .' \\| |// '.
// / \\||| : |||// \
// / _||||| -:- |||||- \
// | | \\\ - /// | |
// | \_| ''\---/'' |_/ |
// \ .-\__ '-' ___/-. /
// ___'. .' /--.--\ `. .'___
// ."" '< `.___\_<|>_/___.' >' "".
// | | : `- \`.;`\ _ /`;.`/ - ` : | |
// \ \ `_. \_ __\ /__ _/ .-` / /
// =====`-.____`.___ \_____/___.-`___.-'=====
// `=---='
//
//
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// 佛祖保佑 永无BUG
//
//
//