小明買了塊高端大氣上檔次的電子手錶,他正準備調時間呢。
在 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。c++
「輸入格式」
一行兩個整數 n, k ,意義如題。ide
「輸出格式」
一行一個整數
表示:按照最優策略按鍵,從一個時間調到另外一個時間最多要按多少次。spa
「樣例輸入」
5 3code
「樣例輸出」
2blog
「樣例解釋」
若是時間正確則按0次。不然要按的次數和操做系列之間的關係以下:
1:+1
2:+1, +1
3:+3
4:+3, +1it
「數據範圍」
對於 30% 的數據 0 < k < n <= 5
對於 60% 的數據 0 < k < n <= 100
對於 100% 的數據 0 < k < n <= 100000
event
【題解】:搜索便可class
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N = 1e5+100; 4 int vis[N]; 5 int n,k; 6 int main() 7 { 8 scanf("%d%d",&n,&k); 9 queue<int>Q; 10 Q.push(0); 11 memset(vis,-1,sizeof(vis)); 12 vis[0] = 0 ; 13 while(!Q.empty()) { 14 int cur = Q.front(); 15 Q.pop(); 16 if( vis[(cur + 1) % n ] == -1 ){ 17 vis[(cur + 1) % n] = vis[cur]+1; 18 Q.push((cur + 1) % n); 19 } 20 if( vis[(cur + k) % n ] == -1 ){ 21 vis[(cur + k) % n] = vis[cur]+1; 22 Q.push((cur + k) % n); 23 } 24 } 25 int ans = 0 ; 26 for(int i=0;i<n;i++){ 27 ans = max(ans,vis[i]); 28 } 29 printf("%d\n",ans); 30 return 0; 31 }