調手錶 藍橋 廣搜

2021-09-22 22:58:30 字數 1368 閱讀 7960

小明買了塊高階大氣上檔次的電子手錶,他正準備調時間呢。在 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

這個題說是從任意乙個分鐘調到另外任意乙個分鐘,但是我們只計算0到其他分鐘的最大次數就可以,因為這些間隔包含了所有的間隔。那麼怎麼算呢?其實仔細想想,就是用廣搜。每一次可以增加k分鐘或者1分鐘,那就從0開始搜,知道搜完所有的點。注意在搜的過程中,要對n取模。

#include#include#include#includeusing namespace std;

typedef long long ll;

const int n=1e5+5;

int n,k,vis[n];

void bfs()

if(vis[(now+1)%n]==-1)

}int ans=0;

for(int i=0;i>n>>k;

bfs();

return 0;

}

藍橋杯 調手錶

小明買了塊高階大氣上檔次的電子手錶,他正準備調時間呢。在 m78 星雲,時間的計量單位和地球上不同,m78 星雲的乙個小時有 n 分鐘。大家都知道,手錶只有乙個按鈕可以把當前的數加一。在調分鐘的時候,如果當前顯示的數是 0 那麼按一下按鈕就會變成 1,再按一次變成 2 如果當前的數是 n 1,按一次...

藍橋杯 調手錶 BFS

小明買了塊高階大氣上檔次的電子手錶,他正準備調時間呢。在 m78 星雲,時間的計量單位和地球上不同,m78 星雲的乙個小時有 n 分鐘。大家都知道,手錶只有乙個按鈕可以把當前的數加一。在調分鐘的時候,如果當前顯示的數是 0 那麼按一下按鈕就會變成 1,再按一次變成 2 如果當前的數是 n 1,按一次...

藍橋杯 調手錶 bfs

小明買了塊高階大氣上檔次的電子手錶,他正準備調時間呢。在 m78 星雲,時間的計量單位和地球上不同,m78 星雲的乙個小時有 n 分鐘。大家都知道,手錶只有乙個按鈕可以把當前的數加一。在調分鐘的時候,如果當前顯示的數是 0 那麼按一下按鈕就會變成 1,再按一次變成 2 如果當前的數是 n 1,按一次...