一只兔子位于二维平面的原点 (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≤105,
1≤x≤109,
1≤ai≤109,ai 各不相同。
保证同一测试点内所有 n 的和不超过 105。
输入样例:
4
2 4
1 3
3 12
3 4 5
1 5
5
2 10
15 4
输出样例:
2
3
1
2
分析
我们可以分别以起点和终点为圆心画圆,就可以发现,我们只需要考虑max(a1…an)即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll arr[100001];
ll n,x,t;
int main(void)
{
cin>>t;
while(t--)
{
ll a=0;
cin>>n>>x;
int flag=0;
for(int i=0; i<n; i++)
{
scanf("%lld",&arr[i]);
a = max(a,arr[i]);
//如果存在可跳的距离等于x,答案就是1
if(arr[i]==x)
flag=1;
}
if(flag)
cout<<1<<endl;
else
{
//如果可跳的最大距离大于x,那么需要两步,就是以起点和以终点为圆心
//画圆,这两个圆的交点
if(x<a)
cout<<2<<endl;
else
{
//能整除就整除
if(x%a==0)
cout<<x/a<<endl;
else//不能整除则需多跳一步
cout<<x/a+1<<endl;
}
}
}
return 0;
}