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

进一步总结,求最大的 \((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\) 中情况,取最大值即可!【至于为何,自己推导】

浙公网安备 33010602011771号