小明買了塊高階大氣上檔次的電子手錶,他正準備調時間呢。在 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
我一開始想的很複雜,一看時間複雜度是o(n),o(nlgn)就直接將dfs,bfs這種暴力列舉排除掉了。之後我想著dp,但是有個取模操作把我難住了。之後我又想數論方向,迴圈節什麼的,路越走越歪,隨後感嘆這道題的難度不是爾等企及的,想必是用了什麼高深莫測的公式演算法。
結果一看題解, 全是bfs。心裡是十分的難過。
bfs經驗+1.
這道題的最優策略其實就是最短路。
我們可以從0出發,做+1和+k兩個策略,直到[0,n-1]所有值都被遍歷過一遍。
這裡強調遍歷一遍意思就是時間複雜度就是o(n).
直接上**:
#include
#include
using
namespace std;
struct node
;int vis[
100010];
intmain()
);int flag = n;
while
(flag)
ans =
max(ans,t.cnt);if
(!flag)
break
; q.
push()
; q.
push()
;}cout
}
藍橋杯 調手錶 BFS
小明買了塊高階大氣上檔次的電子手錶,他正準備調時間呢。在 m78 星雲,時間的計量單位和地球上不同,m78 星雲的乙個小時有 n 分鐘。大家都知道,手錶只有乙個按鈕可以把當前的數加一。在調分鐘的時候,如果當前顯示的數是 0 那麼按一下按鈕就會變成 1,再按一次變成 2 如果當前的數是 n 1,按一次...
藍橋杯 調手錶
小明買了塊高階大氣上檔次的電子手錶,他正準備調時間呢。在 m78 星雲,時間的計量單位和地球上不同,m78 星雲的乙個小時有 n 分鐘。大家都知道,手錶只有乙個按鈕可以把當前的數加一。在調分鐘的時候,如果當前顯示的數是 0 那麼按一下按鈕就會變成 1,再按一次變成 2 如果當前的數是 n 1,按一次...
調手錶 藍橋 廣搜
小明買了塊高階大氣上檔次的電子手錶,他正準備調時間呢。在 m78 星雲,時間的計量單位和地球上不同,m78 星雲的乙個小時有 n 分鐘。大家都知道,手錶只有乙個按鈕可以把當前的數加一。在調分鐘的時候,如果當前顯示的數是 0 那麼按一下按鈕就會變成 1,再按一次變成 2 如果當前的數是 n 1,按一次...