1. 问题描述:
一只兔子位于二维平面的原点 (0,0) 处,它想通过一系列的跳跃,跳到点 (x,0) 处。给定一个长度为 n 的数组 a1,a2,…,an。兔子能从一个点跳到另一个点,当且仅当两点之间的距离等于上述数组中的某个元素的值。请问,兔子从 (0,0) 到 (x,0) 最少需要跳几次?注意,兔子可以跳到非整数坐标的点上。例如,当 x=4,a={1,3} 时,(0,0)→(1,0)→(4,0) 和 (0,0)→(2,5√)→(4,0) 均为合理最佳方案之一。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。每组数据第一行包含两个整数 n 和 x。第二行包含 n 个整数 a1,a2,…,an。
输出格式
每组数据输出一行结果,表示最少跳跃次数。
数据范围
1 ≤ T ≤ 1000,
1 ≤ n ≤ 10 ^ 5,
1 ≤ x ≤ 10 ^ 9,
1 ≤ ai ≤ 10 ^ 9,ai 各不相同。
保证同一测试点内所有 n 的和不超过 10 ^ 5。
输入样例:
4
2 4
1 3
3 12
3 4 5
1 5
5
2 10
15 4
输出样例:
2
3
1
2
来源:https://www.acwing.com/problem/content/3776/
2. 思路分析:
分析题目可以知道我们实际上是在二维平面上跳的,分情况讨论即可,因为x >= 1所以x与原点是不重合的所以步数一定大于等于1,什么情况下等于1的,可以发现当数组中存在一个元素等于x的时候那么就可以一步跳到x,这种情况比较好判断,所以剩余情况的步数都是大于等于2的,什么情况下等于2呢?可以设数组中的最大元素为a,分两种情况进行讨论,a > x或者是a < x,当a > x的时候是否可以通过两步跳到x呢?我们发现是可以的,其实跳的时候与x构成了一个等腰三角形而这个等腰三角形一定存在所以我们可以斜着跳长度为a即可到达x,如下图所示:
还剩下a < x的情况如果x是a的倍数那么跳x / a步就可以到达x,如果x不是a的倍数说明无论如何都不能跳x / a步到达x,只能够跳到离x前面的一段,那么再加一步可以跳到x嘛,发现其实是可以的,其实在跳的时候也是构成了一个等腰三角形,我们在倒数第二步和倒数第一步的时候可以斜着跳a步那么最终也可以跳到x,综上a < x的时候为 x / a向上取整,转化为下取整为(x + a - 1) / a:
3. 代码如下:
class Solution:
def process(self):
T = int(input())
for c in range(T):
n, x = map(int, input().split())
q = list(map(int, input().split()))
# flag判断一步是否可以跳到x
a = flag= 0
for i in range(n):
if q[i] == x: flag = 1
a = max(a, q[i])
if flag: print(1)
elif x < a:
print(2)
# x / a向上取整可以转为向下取整
else: print((x + a - 1) // a)
if __name__ == '__main__':
Solution().process()