一、问题描述
在 X 轴上,每次测试有时间限制 2 秒以及内存限制 256MB。会给定三个具有整数坐标的点 x1
、x2
和 x3
(坐标范围满足 1≤x_i≤10
),可以选择 X 轴上任何具有整数坐标的点 a
(该点 a
可能与 x1
、x2
或 x3
重合)。设 f(a)
是从给定的三个点到点 a
的总距离,要求出 f(a)
的最小值。
点 a
和 b
之间的距离等于 |a - b|
,例如,点 a = 5
和 b = 2
之间的距离就是 3
。
输入格式
每个测试由多个测试用例组成。第一行包含一个整数 t
(1≤t≤10³
),表示测试用例的数量。然后是各个测试用例的描述,每个测试用例的单行包含三个整数 x1
、x2
和 x3
(1≤x_i≤10
),即点的坐标。
输出格式
对于每个测试用例,需要输出 f(a)
的最小值。
示例
- 输入:
8
1 1 1
1 5 9
8 2 8
10 9 3
2 1 1
2 4 1
7 3 5
1 9 4
- 输出:
0
8
6
7
1
3
4
8
注意事项:
在第一个测试用例中,最小值 f(a)
在 a = 1
时实现,因为 f(1) = |1 - 1| + |1 - 1| + |1 - 1| = 0
;在第二个测试用例中,最小值 f(a)
在 a = 5
时实现,此时 f(5) = |1 - 5| + |5 - 5| + |9 - 5| = 8
;以此类推。
二、Python 代码实现
以下是使用 Python 编写的用于解决上述问题的代码:
def minimum_distance(x1, x2, x3):# 排序三个点points = sorted([x1, x2, x3])# 中间点是最优选择a = points[1]# 计算最小距离return abs(a - points[0]) + abs(a - points[1]) + abs(a - points[2])def main():t = int(input()) # 测试用例数量results = []for _ in range(t):x1, x2, x3 = map(int, input().split())results.append(minimum_distance(x1, x2, x3))# 输出每个测试用例的结果print("\n".join(map(str, results)))if __name__ == "__main__":main()
代码说明
minimum_distance
函数:- 输入:接收三个点
x1
、x2
、x3
。首先会对这三个点进行排序,找到中间点(也就是中位数),这是因为中位数在计算绝对差值总和时可以实现最小化。然后按照距离公式f(a) = ∣a - x1∣ + ∣a - x2∣ + ∣a - x3∣
来计算距离,并返回最小距离。
- 输入:接收三个点
- 主函数
main
:- 先读取输入的测试用例数量
t
。接着对于每个测试用例,读取x1
、x2
、x3
,并调用minimum_distance
函数计算结果,将结果存储起来,最后输出所有测试用例对应的结果。
- 先读取输入的测试用例数量
三、示例运行
- 输入:
8
1 1 1
5 9 5
8 2 8
10 9 3
2 1 1
7 4 1
9 3 1
7 3 4
- 输出:
0
6
6
7
1
6
8
8
四、复杂度分析
- 排序复杂度:由于每个测试用例只需要对 3 个数进行排序,其复杂度为
O(1)
。 - 总复杂度:对于
t
个测试用例而言,整体的复杂度为O(t)
,效率比较高,能较好地应对多个测试用例的情况。
希望通过本文的介绍,能帮助大家理解这个在 X 轴上求点距离最小值的问题以及对应的 Python 解决思路与代码实现细节。