题解:P16293 [蓝桥杯 2026 省 Java A 组] 奇怪的地图

· · 题解

P16293 [蓝桥杯 2026 省 Java A] 奇怪的地图 题解

题目大意

求最远的两座城市之间的距离。 ### 公式解法 这题是有公式的,好多题解都是只写公式,我认为有必要把纯纯的推导过程写出来(有的人没背过公式)。 在六边形网格中,两点之间的距离是 $ \max\Bigl( |x_1 - x_2|,\ |y_1 - y_2|,\ \bigl|(x_1 - y_1) - (x_2 - y_2)\bigr| \Bigr)$。 ### 单纯推导解法 这题看起来毫无头绪,但是我们可以把最远的两座城市之间的距离分解一下。 先举个例子吧,现在你要求班上最大的身高差距,你是不是会先找最高的,再找最矮的,最后一减,就出来了。 **这里有个数学知识:在六边形网格中,通常会再加一个维度 $z = x - y$。** 所以,最远的两座城市之间的距离其实就是每个维度(有三个维度)的最大值减最小值,最后再求这三个值的最大值。 不懂的可以看下面详细步骤: 1. 求出 $x$ 维度(坐标)的最大值减最小值 2. 求出 $y$ 维度(坐标)的最大值减最小值 3. 求出 $z = x - y$ 维度(坐标)的最大值减最小值 4. 求出这三个值的最大值 ### 代码如下(Java) ```java import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); long maxA = Long.MIN_VALUE, minA = Long.MAX_VALUE; long maxB = Long.MIN_VALUE, minB = Long.MAX_VALUE; long maxC = Long.MIN_VALUE, minC = Long.MAX_VALUE; for (int i = 0; i < n; i++) { StringTokenizer st = new StringTokenizer(br.readLine()); long x = Long.parseLong(st.nextToken()); long y = Long.parseLong(st.nextToken()); long a = x; long b = y; long c = x - y; if (a > maxA) maxA = a; if (a < minA) minA = a; if (b > maxB) maxB = b; if (b < minB) minB = b; if (c > maxC) maxC = c; if (c < minC) minC = c; } long ans = Math.max(maxA - minA, Math.max(maxB - minB, maxC - minC)); System.out.println(ans); } } ``` 时间复杂度 $O(n)$,空间复杂度 $O(1)$。 点个赞吧 QAQ,求求了!!