[poj2926]Requirements[曼哈顿距离分析+状态枚举]

传送门

本题题意就是求在一个五维世界里的曼哈顿距离最大的两个点。。。五维世界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());
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值