小易來到了一條石板路前,每塊石板上從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
【題目解析】:
題目的意思是從n開始,最少需要累加幾步可以變成指定的數字m,每次累加的值為當前值的乙個約數。
【解題思路】:
將1 - m個石板看做乙個結果陣列stepnum,每個stepnum[i]儲存著從起點到這一步最小的步數,其中0為不能到達。
從起點開始對stepnum進行遍歷,先求i的所有約數(即從stepnum[i]能走的步數),然後更新那幾個能到達的位置的最小步數。如果不能到達則更新為此時位置的最小步數 + 1,如果是能到達的就更新為min(已記錄的最小步數,此處的最小步數 + 1)),遍歷一遍後得到結果。
#include
#include
#include
using
namespace std;
//計算約數,求除了1和本身的約數
void
divisornum
(int n, vector<
int>
&divnum)}}
intjump
(int n,
int m)}if
(stepnum[m]==0
)return-1
;else
//初始化時多給了一步,故需要減1
return stepnum[m]-1
;}intmain()
網易跳石板問題詳解
基本思想 dp演算法 首先建立乙個最大值 1那麼大的陣列表示每乙個石板,之所以是最大值 1的原因是要取下標為最大值的石板 然後遍歷每個石板,把每個石板的約數都儲存起來,然後取到從這個石板過去的最小值 即最優解 然後取最大值對應的那個石板返回就ok dp演算法的核心思維其實就是每一步取最優解,它也是一...
跳石板(詳解)
題目分析 這道題就是計算從n開始加,最少加幾次等於m,前提條件是每次相加的數必須是當前數的約數 思路分析 將m個石板看做乙個儲存結果的陣列jumpnum,每個jumpnum i 中都儲存著從n到當前位置最小的步數,如果是0,則說明不能走到這個位置。從起點開始對jumpnum進行遍歷,先求當前位置的所...
跳石板(待改進)
題目描述 小易來到了一條石板路前,每塊石板上從1挨著編號為 1 2 3 這條石板路要根據特殊的規則才能前進 對於小易當前所在的編號為k的 石板,小易單次只能往前跳k的乙個約數 不含1和k 步,即跳到k x x為k的乙個非1和本身的約數 的位置。小易當前處在編號為n的石板,他想跳到編號恰好為m的石板去...