跳石板---牛客网

#include <iostream>
#include<vector>
#include<math.h>
using namespace std;

//计算第i个的全部余数
//因为复杂度限制 所以值遍历到平方的位置
void getsum(int n, vector<int>& v) {
    for (int i = 2; i <= sqrt(n); i++) {
        if (n % i == 0) {
            v.push_back(i);
            //如果他是 2*2=4这种 那么就只算一个约数 如果是2*3=6 那么两个都要算入6的约数
            if (n / i != i) {
                v.push_back(n / i);
            }
        }
    }
}

int bs(int n, int m) {
    //开24个 是0~23 m为24 所以要实际要开25个
    vector<int> v(m + 1, 0);//全部置为0
    //记住这个v是全部初始化为0  v里记的是步数
    //初始位置置为1
    v[n] = 1;

    for (int i = n; i < m; i++) {
    //这里的i是第几个 而不是单纯为了循环几次
        if(v[i]==0)
        continue;

        vector<int> v2;
        getsum(i, v2);
        for (int j = 0; j < v2.size(); j++) {
            //约数+实数 k+x 小于m时 并且v中已经存在了步数  那么保留最小步数
            //2+6<m 并且 2+6这个位置已经有步数了
            if (v2[j] + i <= m && v[v2[j] + i] != 0) 
            {
                //在2+6这个位置 选出最小步数
            v[v2[j] + i] = v[v2[j] + i] < v[i] + 1 ? v[v2[j] + i] : v[i] +1;
            } 
            //如果这里没步数 那么就是0+1  因为里面全部初始化为0
            else if (v2[j] + i <= m) 
            {
            v[v2[j] + i] = v[i]+1;
            }
        }
    }
    
    return v[m] == 0 ? -1 : v[m]-1;//因为开头在n的位置初始化为1 后续+1步数 多添了1个 所以要在最后-1
}

int main() {
    int n, m;
    while (cin >> n >> m) {
        cout << bs(n, m);
    }
    return 0;
}

 

posted @ 2022-10-04 16:30  lemon-Breeze  阅读(17)  评论(0编辑  收藏  举报