小易來到了一條石板路前,每塊石板上從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
輸入題目的意思是從n開始,最少需要累加幾步可以變成指定的數字m,每次累加的值為當前值的乙個約數。4 24輸出5
將1 - m個石板看做乙個結果陣列stepnum,每個stepnum[i]儲存著從起點到這一步最小的步數,其中0為不能到達。從起點開始對stepnum進行遍歷,先求i的所有約數(即從stepnum[i]能走的步數),然後更新那幾個能到達的位置的最小步數。如果不能到達則更新為此時位置的最小步數 + 1,如果是能到達的就更新為min(已記錄的最小步數,此處的最小步數+ 1)),遍歷一遍後得到結果。
#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()
每日一題 跳一跳
跳一跳 近來,跳一跳這款小遊戲風靡全國,受到不少玩家的喜愛。如果跳到了方塊上,但沒有跳到方塊的中心則獲得 1 分 跳到方塊中心時,若上一次的得分為 1 分或這是本局遊戲的第一次跳躍則此次得分為 2 分,否則此次得分比上一次得分多兩分 即連續跳到方塊中心時,總得分將 2,4,6,8 現在給出乙個人跳一...
LeetCode每日一題 接雨水 動態規劃
給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。如圖 這道題的解法依舊很簡單,我們可以搜尋兩個相同數列,取他的指標相加減,也可以從底部向上依次累加,尋找每一層會存續的水,我們依舊先看暴力解法是否可以完成。在暴力解法之中,我們可以一層一層的搜尋,將每一...
每日一題 83 分蘋果(貪心)
n 只奶牛坐在一排,每個奶牛擁有 ai 個蘋果,現在你要在它們之間轉移蘋果,使得最後所有奶牛擁有的蘋果數都相同,每一次,你只能從乙隻奶牛身上拿走恰好兩個蘋果到另乙個奶牛上,問最少需要移動多少次可以平分蘋果,如果方案不存在輸出 1。輸入描述 每個輸入包含乙個測試用例。每個測試用例的第一行包含乙個整數 ...