日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

跳石板(详解)

發布時間:2024/7/23 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 跳石板(详解) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:
https://www.nowcoder.com/practice/4284c8f466814870bae7799a07d49ec8?tpId=85&&tqId=29852&rp=1&ru
題目分析:
這道題就是計算從N開始加,最少加幾次等于M,前提條件是每次相加的數必須是當前數的約數
思路分析:
將M個石板看做一個保存結果的數組jumpNum,每個jumpNum[i]中都儲存著從N到當前位置最小的步數,如果是0,則說明不能走到這個位置。從起點開始對jumpNum進行遍歷,先求當前位置的所有約數也就是當前位置可以向前走的步數,然后更新到能到達的位置的最小步數。之前沒有來過這個位置,就將該位置更新為當前步數+1,否則更新為之前的步數和當前步數+1兩者最小的,經過遍歷一一次后得到結果,jumpNum[M]就是從N開始加,加到M的最少次數,如果是0,說明不可能加到M。
圖解思路:

上代碼:

#include<iostream> #include<vector> #include<algorithm>using namespace std;//計算約數,求除了1和本身的約數 void divisorNum(int n, vector<int>& divNum) {for (int i = 2; i <= sqrt(n); i++){if (n%i == 0){divNum.push_back(i);//非平方數時還有另一個數也要加入if (n / i != i)divNum.push_back(n / i);}} } int Jump(int N, int M) {//儲存到達此stepNum點的步數,vector<int>stepNum(M + 1, 0);//初始N為1步,從N到N為1步stepNum[N] = 1;for (int i = N; i < M; i++){//用來保存N的所有約數,即為從本身這個點開始能走的數量vector<int>divNum;//如果當前的位置是0代表這個點不能到,因為0沒有約數if (stepNum[i] == 0)continue;//將當前位置可以走的步數存放在divisorNUm中divisorNum(i, divNum);//開始挨個試這些步數for (int j = 0; j<divNum.size(); j++){//之前走到該點的步數為stepNum[divNum[j] + i]//走到當前位置的步數為stepNum[i] + 1//如果當前位置不是M,并且走的步數不為零,//那么當前能走到該點的步數要和之前該點的步數進行對比,取最小的if ((divNum[j] + i) <= M && stepNum[divNum[j] + i] != 0)stepNum[divNum[j] + i] = min(stepNum[divNum[j] + i], stepNum[i] + 1);//否則,如果當前位置不是M,//那么就說明走到這個位置的步數為0,就要將這個位置的步數更新else if((divNum[j] + i) <= M)stepNum[divNum[j] + i] = stepNum[i] + 1;}}for (int i = 0; i < stepNum.size(); ++i){cout << stepNum[i] << "->";}cout << endl;if (stepNum[M] == 0)return-1;else//初始化時多給了一步,故需要減1return stepNum[M] - 1; } int main() {int n, m;cin >> n >> m;cout << Jump(n, m) << endl;return 0; }

總結

以上是生活随笔為你收集整理的跳石板(详解)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。