【最大曼哈顿距离】POJ2926 Requirements

来源:互联网 发布:网络保密管理 编辑:程序博客网 时间:2024/04/30 21:31

POJ2926


题目大意:


给定n个5维坐标的点,求这n个点中曼哈顿距离的最大值。

暴力枚举肯定超时。

只考虑二维空间上两个坐标之间的曼哈顿距离(x1, y1) 和 (x2, y2),|x1-x2| +|y1-y2|去掉绝对值符号后共有下列四种情况

(x1-x2) + (y1-y2), (x1-x2) + (y2-y1), (x2-x1) + (y1-y2), (x2-x1) + (y2-y1)

转化一下:

(x1+y1) - (x2+y2), (x1-y1) - (x2-y2), (-x1+y1) - (-x2+y2), (-x1-y1) - (-x2-y2)

注意符号

显然,任意给两个点,我们分别计算上述四种情况,那么最大值就是曼哈顿距离。

转化后,“-”号两侧的坐标形式是一样的。维数为5,因此我们可以用二进制枚举。

最大曼哈顿距离 = max{每种情况下的最大值-最小值}

可以扩展成M维的。


CODE:

//POJ2926
#include<cstdio>#include<algorithm>#define fo(i,a,b) for (int i = a;i <= b;i ++)using namespace std;const int maxn = 100005;double A[maxn][5];int N;double ans;int main(){scanf("%d",&N);fo(i,1,N) fo(j,0,4) scanf("%lf",&A[i][j]);ans = -1e20;fo(stat,0,(1 << 5)-1){double ma = -1e20;double mi = 1e20;fo(i,1,N){double t = 0;fo(j,0,4)if (stat & (1 << j)) t += A[i][j];else t -= A[i][j];ma = max(ma,t);mi = min(mi,t);}ans = max(ans,ma-mi);}printf("%.2f\n",ans);}


0 0
原创粉丝点击