矩阵游戏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
压缩数组,采取贪心策略,两两小于0则取反,两两大于0则不变,一大一下判断反不反。
注意不要忽略最后单出来的一位。
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn=210; int h[maxn]; int main() { int i,j,n,k,ans=0; scanf("%d",&n); for(i=1;i<=n;i++) for(j=1;j<=n;j++){ scanf("%d",&k); h[j]+=k; } sort(h+1,h+n+1); for(i=1;i<n;i+=2){ if(h[i]<=0&&h[i+1]<=0) ans=ans-h[i]-h[i+1]; else if(h[i]>=0&&h[i+1]>=0) ans=ans+h[i]+h[i+1]; else if(h[i]<=0&&h[i+1]>=0) ans=ans+max(h[i+1]+h[i],-h[i]-h[i+1]); } for(;i<=n;i++) ans+=h[i]; printf("%d\n",ans); return 0; }
时间: 2024-10-08 07:27:29