1. 程式人生 > 實用技巧 >藍橋杯 調手錶(bfs解法)

藍橋杯 調手錶(bfs解法)

小明買了塊高階大氣上檔次的電子手錶,他正準備調時間呢。
在 M78 星雲,時間的計量單位和地球上不同,M78 星雲的一個小時有 n 分鐘。
大家都知道,手錶只有一個按鈕可以把當前的數加一。在調分鐘的時候,如果當前顯示的數是 0 ,那麼按一下按鈕就會變成 1,再按一次變成 2 。
如果當前的數是 n - 1,按一次後會變成 0 。
作為強迫症患者,小明一定要把手錶的時間調對。如果手錶上的時間比當前時間多1,則要按 n - 1 次加一按鈕才能調回正確時間。
小明想,如果手錶可以再新增一個按鈕,表示把當前的數加 k 該多好啊……
他想知道,如果有了這個 +k 按鈕,按照最優策略按鍵,從任意一個分鐘數調到另外任意一個分鐘數最多要按多少次。
注意,按 +k 按鈕時,如果加k後數字超過n-1,則會對n取模。
比如,n=10, k=6 的時候,假設當前時間是0,連按2次 +k 按鈕,則調為2。
「輸入格式」
一行兩個整數 n, k ,意義如題。
「輸出格式」
一行一個整數
表示:按照最優策略按鍵,從一個時間調到另一個時間最多要按多少次。
「樣例輸入」

5 3

「樣例輸出」

 2


「樣例解釋」
如果時間正確則按0次。否則要按的次數和操作系列之間的關係如下:
1:+1
2:+1, +1
3:+3
4:+3, +1

「資料範圍」
對於 30% 的資料 0 < k < n <= 5
對於 60% 的資料 0 < k < n <= 100
對於 100% 的資料 0 < k < n <= 100000

資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗 ?< 1000ms
*/

思路:比較基礎的bfs題目,據說動態規劃也能過。用step陣列記錄每個點的最優按鍵值,最後進行遍歷找出最大值即可。

#include<iostream>
#include
<queue> using namespace std; const int maxn = 100010; int step[maxn]; bool vis[maxn]; int n,k; void bfs() { int head,next; queue<int> q; step[0] = 0;//初始化 vis[0] = true; q.push(0); while(!q.empty()) { head = q.front(); q.pop(); for(int i = 0; i < 2
; i ++) { if(i == 0) next = (head + 1) % n; else next = (head + k) % n; if(vis[next]== false)//方案數 { vis[next]= true; step[next] = step[head] + 1; q.push(next); } } } } int main() { cin>>n>>k; bfs(); int max_step = step[0]; for(int i = 0; i < n; i ++) { max_step = max(max_step,step[i]);//遍歷出最大次數 } cout << max_step<<endl; return 0; }