多维曼哈顿最大距离

版权声明:本文为博主原创文章,未经博主允许必须转载。 https://blog.csdn.net/qq_35950004/article/details/81987559

思路就是通过枚举每一个绝对值符号中相减的两个数,一负一正,哪个取负哪个取正,显然正确的选法值最大,值最大时一定有正确的选法。
绝对值去掉后,二进制枚举加贪心就行了。

#include<bits/stdc++.h>
#define maxn 100005
#define inf 0x3f3f3f3f
using namespace std;

int n,x[maxn][5],ans;

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=0;j<5;j++)
            scanf("%d",&x[i][j]);

    for(int sta=0;sta<(1<<5);sta++)
    {
        int Max = -inf , Min = inf;
        for(int i=1;i<=n;i++)
        {
            int t=0;
            for(int j=0;j<5;j++)
                if(sta & (1<<j))
                    t += x[i][j];
                else
                    t -= x[i][j];
            Max = max(Max , t) , Min = min(Min , t);
        }
        ans = max(ans , Max - Min);
    }

    printf("%d\n",ans);
}

猜你喜欢

转载自blog.csdn.net/qq_35950004/article/details/81987559