每日一題 26 跳石板 貪心 動態規劃

2021-09-28 14:47:55 字數 1174 閱讀 4988

小易來到了一條石板路前,每塊石板上從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

題目的意思是從n開始,最少需要累加幾步可以變成指定的數字m,每次累加的值為當前值的乙個約數。

將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。輸入描述 每個輸入包含乙個測試用例。每個測試用例的第一行包含乙個整數 ...