直接暴力求,n^2*5 稳T
从二维任意两点距离:
|x1-x2|+|y1-y2|
我们把绝对值去掉:有下面四种情况。。
(x1-x2) + (y1-y2), (x1-x2) + (y2-y1), (x2-x1) + (y1-y2), (x2-x1) + (y2-y1)
然鹅还是不好做。。为了高效处理,我们把相同点的信息放到一起:
(x1+y1) - (x2+y2), (x1-y1) - (x2-y2), (-x1+y1) - (-x2+y2), (-x1-y1) - (-x2-y2)
发现,刚好对应一个点x,y取值的4种情况。n个点这4种情况,分别讨论,每种取最大值减去最小值就是结果最大的。
5维同理。。
提取出来相同的点后,放在前后,中间符号变负,前后点n维,每维符号取值要么正要么负,正好对应了二进制压缩。。
搞搞就行
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int M = 1e5+7;
#define INF 1e100
double a[M][5];
int n;
int main() {
while (~scanf("%d", &n) )
{
for(int i=1;i<=n;i++)
for(int j=1;j<=5;j++)
scanf("%lf",&a[i][j]);
double ans=0, mi,ma;
for(int k=0;k<(1<<5);k++)//对应每种状态求最大值
{
mi=INF,ma=-INF;
for(int i=1;i<=n;i++)
{
double s=0;
for(int j=1;j<=5;j++)
{
if(1<<(j-1)&k)s+=a[i][j];
else s-=a[i][j];
}
ma=max(s,ma);
mi=min(s,mi);
//printf("%lf----- ",s);
}
// printf("%lf %lf\n",mi,ma);
ans=max(ans,(ma-mi));
}
printf("%.2f\n",ans);
}
return 0;
}