曼哈顿距离

曼哈顿距离

两个单元格 \((x_i, y_i)\)\((x_j, y_j)\) 之间的曼哈顿距离为 \(|x_i - x_j| + |y_i - y_j|\)

image

进一步总结,求最大的 \((x_i + y_i)_{max}\) - \((x_i + y_i)_{min}\) 与 最大的 \((x_i - y_i)_{max} - (x_i,y_i)_{min}\) ,两者取最大值即可!

a = [(x + y,i) for i,(x,y) in enumerate(points)]
b = [(x - y,i) for i,(x,y) in enumerate(points)]
a.sort()
b.sort()
ans = max(a[-1][0] - a[0][0],b[-1][0] - b[0][0])

思考1:如果我们去掉一个点,使得剩下点的最大曼哈顿距离尽可能小,应该怎样做?

我们最多需要去掉4个点,分别是

\((x_{i1} + y_{i1})_{max}\)\(i_1\)

\((x_{i2} + y_{i2})_{min}\)\(i_2\)

\((x_{i3} - y_{i_3})_{max}\)\(i_3\)

\((x_{i4}-y_{i4})_{min}\)\(i_4\)

def remove():
    a = [(x + y,i) for i,(x,y) in enumerate(points)]
    b = [(x - y,i) for i,(x,y) in enumerate(points)]
    a.sort()
    b.sort()
    return {a[-1][1],a[0][1],b[-1][1],b[0][1]}

思考2:如果涉及的更高维的点,应该怎么求最大的曼哈顿距离?

P1648 看守 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

import sys
from math import inf
input = lambda:sys.stdin.readline()

n,d = map(int,input().split())
points = [[]for _ in range(n)]

for i in range(n):
    points[i] = [*map(int,input().split())]

ans = 0
for k in range(0,1 << d):
    mx,mi = -inf,inf
    for i in range(n):
        s = 0
        for j in range(d):
            if (k >> j) & 1:
                s += points[i][j]
            else:
                s -= points[i][j]
        mi = min(mi,s)
        mx = max(mx,s)
    ans = max(ans,mx - mi)
print(ans)

解释,用二进制状态压缩 \(1111\),表示 x1 + x2 + x3 + x4;\(1010\) 表示 x1 - x2 + x3 - x4。

对于d维的坐标,有 \(2^d\) 中情况,取最大值即可!【至于为何,自己推导】

posted @ 2024-03-31 16:30  gebeng  阅读(92)  评论(0)    收藏  举报