现在的位置: 首页 > 综合 > 正文

ZOJ_Requirements

2014年03月28日 ⁄ 综合 ⁄ 共 964字 ⁄ 字号 评论关闭

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;	
}


抱歉!评论已关闭.