列表

详情


WY28. 跳石板

描述

小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3.......
这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和本身的约数)的位置。 小易当前处在编号为N的石板,他想跳到编号恰好为M的石板去,小易想知道最少需要跳跃几次可以到达。
例如:
N = 4,M = 24:
4->6->8->12->18->24
于是小易最少需要跳跃5次,就可以从4号石板跳到24号石板

输入描述

输入为一行,有两个整数N,M,以空格隔开。 (4 ≤ N ≤ 100000) (N ≤ M ≤ 100000)

输出描述

输出小易最少需要跳跃的步数,如果不能到达输出-1

示例1

输入:

4 24

输出:

5

原站题解

C++ 解法, 执行用时: 1ms, 内存消耗: 368KB, 提交时间: 2017-06-12

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

vector<int> getyueshu(int n){
    vector<int> res;
     for(int i=2;i<=sqrt(n);i++){
        if(n%i==0){
            res.push_back(i);
            if(n/i != i)
                res.push_back(n/i);
        }
    }
    return res;
}

int main(){
    int N,M;
    cin>>N>>M;
    vector<int> dp(M+1,M);
    dp[N]=0;
    for(int i=N;i<=M;i++){
        vector<int> path=getyueshu(i);
        for(int j=0;j<path.size();j++){
            if(i+path[j]<=M){
            	dp[i+path[j]]=min(dp[i]+1,dp[i+path[j]]);
            }
        }
    }
    if(dp[M]==M){
        cout<< -1;
    } 
    else{
        cout<< dp[M];
    }
    return 0;
}   

C++ 解法, 执行用时: 1ms, 内存消耗: 372KB, 提交时间: 2017-06-15

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>

std::vector<int> getDivisor(int num) {
	std::vector<int> ans;
	for (int i = 2; i <= sqrt((double)num); i++) 
		if (!(num % i)) {
			ans.push_back(i);
			if (num / i != i) 
				ans.push_back(num / i);
		}
	return ans;
}
int main()
{
	using namespace std;
	int n, m;
	while (cin >> n >> m) {
		vector<int> index(m + 1, 0);
		index[n] = 1;
		for (int i = n; i <= m; i++) {
			vector<int> divisors = getDivisor(i);
			if (!index[i])
				continue;
			else
				for (int j = 0; j < divisors.size(); j++) {
						if ((divisors[j] + i) <= m && index[divisors[j] + i] != 0)
							index[divisors[j] + i] = min(index[divisors[j] + i], index[i] + 1);
						else if ((divisors[j] + i) <= m)
							index[divisors[j] + i] = index[i] + 1;
				}
		}
		int ans = index[m] == 0 ? -1 : index[m] - 1;
		cout << ans << endl;
	}
	return 0;
}

上一题