一只兔子位于二维平面的原点 (0,0)(0,0) 处,它想通过一系列的跳跃,跳到点 (x,0)(x,0) 处。
给定一个长度为 nn 的数组 a1,a2,…,ana1,a2,…,an。
兔子能从一个点跳到另一个点,当且仅当两点之间的距离等于上述数组中的某个元素的值。
请问,兔子从 (0,0)(0,0) 到 (x,0)(x,0) 最少需要跳几次?
注意,兔子可以跳到非整数坐标的点上。
例如,当 x=4x=4,a={1,3}a={1,3} 时,(0,0)→(1,0)→(4,0)(0,0)→(1,0)→(4,0) 和 (0,0)→(2,5√)→(4,0)(0,0)→(2,5)→(4,0) 均为合理最佳方案之一。
输入格式
第一行包含整数 TT,表示共有 TT 组测试数据。
每组数据第一行包含两个整数 nn 和 xx。
第二行包含 nn 个整数 a1,a2,…,ana1,a2,…,an。
输出格式
每组数据输出一行结果,表示最少跳跃次数。
数据范围
1≤T≤10001≤T≤1000,
1≤n≤1051≤n≤105,
1≤x≤1091≤x≤109,
1≤ai≤1091≤ai≤109,aiai 各不相同。
保证同一测试点内所有 nn 的和不超过 105105。
输入样例:
4
2 4
1 3
3 12
3 4 5
1 5
5
2 10
15 4
输出样例:
2
3
1
2
题解
到达(k,0)点
只要n个最长的线能到(k,0)点即可到达
如果最长的线比k大的话
就找有没有刚好能到(k,0)点的线
有的话就是1,没有的话就2 。
最后的答案就是(k/最长的线长)向上取整
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
long long t;
long long n,k;
cin>>t;
long long a[100005];
while(t--)
{
cin>>n>>k;
for (int i = 0; i < n; i ++ )
{
cin>>a[i];
}
int p=0;
sort(a,a+n);
long long h=0;
if(k<a[n-1])
{
for (int i = 0; i < n; i ++ )
{
if(k==a[i])
p=1;
}
if(p==0)
cout<<2<<endl;
else
cout<<1<<endl;
}
else
{
if(k%a[n-1]==0)
h=k/a[n-1];
else
h=k/a[n-1]+1;
cout<<h<<endl;
}
}
}