本题题意就是求在一个五维世界里的曼哈顿距离最大的两个点。。。五维世界nb
对于一个二维平面上两点(x1,y1)(x2,y2),它们的曼哈顿距离是|x1-x2|+|y1-y2|
在去掉绝对值前,我们将描述同一个点的值丢到一块去,就会变成这样:
(x1-y1)-(x2-y2),但由于绝对值本身还在,所以对于同一个点,有四种表示情况:
x1-y1,x1+y1,-x1-y1,-x1+y1;且x2与x1对应。
也就是说每一个值有正负两种取值方式。所以在二维平面中,对于一个点有2的2次方也就是4种取值方式。
换句话说,曼哈顿距离最远的两个点也跳不开这几种表示方式。我们令正号为1,负号为0,也就是有00,01,10,11四种表示方式。
而对于五维平面,则有2的5次方也就是32种表示方式,从00000到11111也就是从0到31。
那我们只要处理出每个点在这32种情况下的值,与同状态下另一个点减出来的最大值再取最大值就是我们需要的答案了。
这个操作开个maxx和minn相信大家都会。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define in read()
using namespace std;
int in{
int cnt=0,f=1;char ch=0;
while(!isdigit(ch)){
ch=getchar();
if(ch=='-')f=-1;
}
while(isdigit(ch)){
cnt=cnt*10+ch-48;
ch=getchar();
}
return cnt*f;
}
int dem=5;
struct node{
double x[6];
}que[100003];
int n;double maxx[32],minn[32];
double solve(){
int tmp=31;
for(int i=0;i<tmp;i++){
maxx[i]=-0x3f3f3f3f;minn[i]=0x3f3f3f3f;
}
for(int i=1;i<=n;i++){
for(int j=0;j<tmp;j++){
int t=j;
double s=0;
for(int k=1;k<=5;k++){
if(t&1)s+=que[i].x[k];
else s-=que[i].x[k];
t>>=1;
}
maxx[j]=max(maxx[j],s);
minn[j]=min(minn[j],s);
}
}
double ans=0;
for(int i=0;i<tmp;i++){
ans=max(ans,maxx[i]-minn[i]);
}
return ans;
}
int main(){
n=in;
for(int i=1;i<=n;i++){
for(int j=1;j<=dem;j++){
scanf("%lf",&que[i].x[j]);
}
}
printf("%.2lf",solve());
}