http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2688
题意:给定N(N <= 1e5)个点,求两点之间的最大曼哈顿距离;
分析:由二维的曼哈顿距离可知:dis(p1,p2) = abs(x1-x2) + abs(y1-y2) ;
则dis(p1,p2) = max{(x1+y1) - (x2+y2) , (x1-y1) - (x2-y2) , (-x1+y1) - (-x2+y2) , (-x1-y1) - (-x2-y2) } ;
因此只需要判断两个最远点之间的2^k个距离中的最大值就是所要求的值,这里k是点的维数。
时间复杂度为O(N*2^K) ;
代码:
/*
ZOJ 2688 Requirements
Tips : dfs + 曼哈顿距离;
*/
#include<stdio.h>
int N;
double data[6] ;
double myh[100001][33] ;
int ch[6] ;
void dfs(int start,int i,int index){
if(start == 6){
double res = 0 ;
for(int j=1;j<=5;j++){
res += data[j]*ch[j] ;
}
myh[i][index] = res ;
return ;
}
ch[start] = -1;
dfs(start+1,i,index*2) ; //第start个元素取-1
ch[start] = 1 ;
dfs(start+1,i,index*2+1); //第start个元素取1 ;
}
int main()
{
while(scanf("%d",&N) && N)
{
for(int i=1;i<=N;i++)
{
for(int j=1;j<=5;j++)
{
scanf("%lf",&data[j]);
}
dfs(1,i,0);
}
double maxi = 0 ;
for(int i=0;i<32;i++)
{
double min_ = myh[1][i] ;
double max_ = myh[1][i] ;
for(int j=2;j<=N;j++){
if(myh[j][i] < min_ ) min_ = myh[j][i] ;
if(myh[j][i] > max_ ) max_ = myh[j][i] ;
}
if(maxi < max_ - min_ )
maxi = max_ - min_ ;
}
printf("%.2f\n",maxi);
}
return 0;
}