版权声明:本文为博主原创文章,未经博主允许必须转载。 https://blog.csdn.net/qq_35950004/article/details/81987559
思路就是通过枚举每一个绝对值符号中相减的两个数,一负一正,哪个取负哪个取正,显然正确的选法值最大,值最大时一定有正确的选法。
绝对值去掉后,二进制枚举加贪心就行了。
#include<bits/stdc++.h>
#define maxn 100005
#define inf 0x3f3f3f3f
using namespace std;
int n,x[maxn][5],ans;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=0;j<5;j++)
scanf("%d",&x[i][j]);
for(int sta=0;sta<(1<<5);sta++)
{
int Max = -inf , Min = inf;
for(int i=1;i<=n;i++)
{
int t=0;
for(int j=0;j<5;j++)
if(sta & (1<<j))
t += x[i][j];
else
t -= x[i][j];
Max = max(Max , t) , Min = min(Min , t);
}
ans = max(ans , Max - Min);
}
printf("%d\n",ans);
}