【搜索】調手錶

標題:調手錶


小明買了塊高端大氣上檔次的電子手錶,他正準備調時間呢。
在 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 }
View Code
相關文章
相關標籤/搜索