由于要求最小步骤,那么考虑贪心策略可以发现采用最大的那个数字是最优的。
- 当距离等于最大数字时,那么答案为1
- 当距离大于最大数字时,那么可以先将前面的一大部分填上,最后一次肯定会“溢出”,那么只需要将倒数第二次和倒数第一次构成一个等腰三角形即可,这样就能保证是最少次数。
#include <iostream>
#include <map>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 100010;
typedef long long ll;
ll a[N];
map<int, int> mp;
int main(){
int t;
cin >> t;
while(t --){
mp.clear();
int n, x;
cin >> n >> x;
for(int i = 0; i < n; i ++){
cin >> a[i];
mp[a[i]] = 1;
}
sort(a, a + n);
if(mp[x] == 1)
cout << 1 << endl;
else
cout << max((ll)2, (x + a[n - 1] - 1) / a[n - 1]) << endl;
}
return 0;
}
几天不写cf,啥都不会了