问题
https://vjudge.net/problem/UVA-11012
分析
太强了
公式$|x_i-x_j|+|y_i-y_j|+|z_i-z_j|=(+/-(x_i-x_j) + +/-(y_i-y_j) + +/-(z_i-z_j)) $,其中结果是8种计算方式中最大的那个,因为是绝对值,一定是正数相加。现在要求两个数的曼哈顿距离的最大值,那也就是绝对值中最大的结果,所以一定是大于等于用8种计算方式简化的计算的结果,8种计算方式,每种单独计算,遍历一遍n个数字,然后取8个结果中的最大值。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
const int maxn=100000+5,Inf=0x3f3f3f3f;
int n,kase=0,T,pos[maxn][3];
int cx[]={1,1,1,1,-1,-1,-1,-1};
int cy[]={1,1,-1,-1,1,1,-1,-1};
int cz[]={1,-1,1,-1,1,-1,1,-1};
int main(void){
scanf("%d",&T);
while(kase<T){
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%d%d%d",&pos[i][0],&pos[i][1],&pos[i][2]);
}
int ans=0;
for(int i=0;i<8;++i){
int Max=-Inf,Min=Inf;
for(int j=0;j<n;++j){
int t=pos[j][0]*cx[i]+pos[j][1]*cy[i]+pos[j][2]*cz[i];
Max=max(Max,t);
Min=min(Min,t);
}
ans=max(ans,Max-Min);
}
printf("Case #%d: %d\n",++kase,ans);
}
return 0;
}