目录
牛客WY28 跳石板
解析代码
牛客WY28 跳石板
跳石板_牛客题霸_牛客网
解析代码
#include <iostream>
#include <vector>
#include <climits>
#include <cmath>
using namespace std;void get_div_num(int n, vector<int>& arr)
{for (int i = 2; i <= sqrt(n); ++i){if (n % i == 0) // i是约数{arr.push_back(i);if (n / i != i) // 另一个大的约数arr.push_back(n / i);}}
}
int Jump(int n, int m)
{vector<int> step(m + 1, INT_MAX);// 存放到达这个位置的最少步数,int_max表示不可达到step[n] = 0; // 当前位置初始化for (int i = n; i < m; ++i){if (step[i] == INT_MAX)continue;// 获取i的约数,并保存到arrvector<int> arr;get_div_num(i, arr);for (int j = 0; j < arr.size(); ++j){if (arr[j] + i <= m && step[arr[j] + i] != INT_MAX){ // 挑选一个最小值step[arr[j] + i] = min(step[arr[j] + i], step[i] + 1);}else if (arr[j] + i <= m && step[arr[j] + i] == INT_MAX){ // 更新不可到达的地方step[arr[j] + i] = step[i] + 1;}}}return step[m] == INT_MAX ? -1 : step[m];
}int main()
{int n = 0, m = 0, min_step = 0;while (cin >> n >> m){min_step = Jump(n, m);cout << min_step;}return 0;
}