题目描述
一只兔子位于二维平面的原点 (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
算法1
考虑三种情况 注意这是在二维坐标中 而不是在x数轴上
1、
若数组中有值==x 则一步即可
2、
因为要求最小步数,所以根据数组中最大值来划分。
求得数组中得最大值a,若a大于x 则两步一定可以走到 (等腰三角形)
3、
若最大值a小于x,则x/a之后一定在a前,且剩下得距离一定小于a,根据2,再走1步(等腰三角形)一定可以走到x
则答案就是 x/a上取整 注意上去整写法 要写成(x+a-1)/a。
C++ 代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n,x;
cin>>n>>x;
int maxn=0;
int flag=0;
for(int i=1;i<=n;i++){
int y;
cin>>y;
if(y==x)
{flag=1;}
maxn=max(y,maxn);
}
if(flag==1)
cout<<"1"<<endl;
else if(maxn>x)
cout<<"2"<<endl;
else
cout<<(x+maxn-1)/maxn<<endl;
}
return 0;
}