解题思路:贪心
输入数据时,构建哈希集合并记录最大值max
。
1.首先判断是否直接到达,只需判断x是否在集合内即可,利用哈希查找O(1)实现。
2.注意特殊情况max > x
时,需要两次到达。
3.max < x
时,使用贪心的思想,每次跳最远的距离,最后直接到达.
相当于前面n次累加调整一个角度,最后一次刚好到达。
次数为x / max
向上取整
计算过程是O(1),构建哈希集合是O(N),总的时间复杂度是O(N)
时间复杂度
O(N)
C++ 代码
#include <iostream>
#include <unordered_set>
#include <iomanip>
#include <cmath>
using namespace std;
int T;
int main() {
scanf("%d", &T);
while(T--) {
int n, x;
scanf("%d%d", &n, &x);
unordered_set<int> a;
int _max = 0;
for(int i = 0; i < n; i++) {
int t;
scanf("%d", &t);
a.insert(t);
_max = max(_max, t);
}
if(a.count(x)==1) {
printf("%d\n", 1);
} else if(_max > x){
printf("%d\n", 2);
} else{
printf("%.0f\n", ceil(double(x)/_max));
}
}
return 0;
}