poj2926 Requirements

题目很长 故事很短…..
求曼哈顿距离
5维的 其实几维的不重要 模版都是一样的
思考二维的 去掉绝对值分正负讨论 得出规律
符号使用二进制枚举

#include<cstdio>
typedef double d;
const d maxm=0x3f3f3f3f;
const d minm=-0x3f3f3f3f;
const int maxn=100005;
struct note{
    d x[5];
}a[maxn];
d max(d aa,d bb){
    return aa>bb?aa:bb;
}
d min(d aa,d bb){
    return aa<bb?aa:bb;
}
d abs_(d aa){
    if(aa<0.0)return -aa;
    return aa;
}
int main(){
    int n;
    while(scanf("%d",&n)!=-1){
        for(int i=0;i<n;i++){
            scanf("%lf%lf%lf%lf%lf",&a[i].x[0],&a[i].x[1],&a[i].x[2],&a[i].x[3],&a[i].x[4]);
        }
        int const_=(1<<5);
        d ans=minm;

        for(int ii=0;ii<const_;ii++){
            d max_=minm,min_=maxm;//一开始这个也在最上面 要求的是每次的max_ min_
            for(int i=0;i<n;i++){//犯错误 一开始这层循环在最上面 当然是错了
                d sum=0.0;
                for(int j=0;j<5;j++){
                    if(ii>>j &1) //二进制枚举
                    sum+=a[i].x[j];
                    else sum-=a[i].x[j];
                }
                max_=max(max_,sum);
                min_=min(min_,sum);
            }
            ans=max(ans,(max_-min_));//加不加abs其实效果一样 因为情况计算都是对立的
        }
        printf("%.2lf\n",ans);
    }
    return 0;
}

你可能感兴趣的:(poj2926 Requirements)