poj 2926 Requirements N维最远曼哈顿距离

来源:互联网 发布:网络 全球 编辑:程序博客网 时间:2024/04/30 03:41

以前写过1~3维的最远曼哈顿距离,(本博客第一篇,代码奇丑)这次写N维,可作模版。

复杂度:O(n*2^m)  (n个点,m维)

原理: |x1-y1|+|x2-y2|+... ...+|xm-ym| 去掉绝对值后x、y分别都有2^m种状态,枚举之。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int dem=5;        //维数const int maxxn=100005;const double inf=1e200;struct Point{    double x[dem];}p[maxxn];int n;double minx[1<<dem], maxx[1<<dem];double solve(){    int i, j, k, t, tmp=1<<dem;    double s, ans=-inf;    for(i=0; i<tmp; i++){        minx[i]=inf;        maxx[i]=-inf;    }    for(i=0; i<n; i++){        for(j=0; j<tmp; j++){            t=j;s=0;            for(k=0; k<dem; k++){                if(t&1)                s+=p[i].x[k];                else s-=p[i].x[k];                t>>=1;            }            if(maxx[j]<s)maxx[j]=s;            if(minx[j]>s)minx[j]=s;        }    }    for(i=0; i<tmp; i++){        if(maxx[i]-minx[i]>ans)        ans=maxx[i]-minx[i];    }    return ans;}int main(){    //freopen("1.txt", "r", stdin);    int i, j;    while(scanf("%d", &n)!=EOF){        for(i=0; i<n; i++){            for(j=0; j<dem; j++)                scanf("%lf", &p[i].x[j]);        }        printf("%.2f\n", solve());    }    return 0;}


 

 

原创粉丝点击