調手錶 寬度優先搜尋

2021-10-08 23:28:59 字數 1475 閱讀 7204

小明買了塊高階大氣上檔次的電子手錶,他正準備調時間呢。

在 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 ,意義如題。

0 < k < n <= 100000

一行乙個整數

表示:按照最優策略按鍵,從乙個時間調到另乙個時間最多要按多少次。

5 3如果時間正確則按0次。否則要按的次數和操作系列之間的關係如下:

1:+1

2:+1, +1

3:+3

4:+3, +1

這種可以迴圈的題第一步肯定是要把數擴大一倍分析:

以n== 5 , k==3為例

0 1 2 3 4 5 6 7 8 9

從4到0可以等效為從4到5,從4到1可以等效為從4到6,依次類推.從3到2就可以等效為從3到7.

進一步分析,我們關心的是兩個數之間的距離,從3到7和從0到4變化的次數並無區別,從2到4和從0到2的變化次數也無區別,所以所有的情況都可以等效為從0到m(m為1~n-1的乙個數),這道題也就轉化成從0到m最短路中最大的那乙個.

實際問題轉化為搜尋,首先要畫乙個圖,把這個圖便利一遍也就是搜尋.

從這個圖中我們可以數出來出來從0到任一一點的最短路,最後再求乙個最大值即可.

注意n取得比較小,其他要注意取餘.

最短路問題用寬度優先搜尋.

#include

using

namespace std;

const

int maxn=

1e5+10;

#define inf 0x3f3f3f3f

int n,k;

int a[maxn]

;int vis[maxn]

;int d[maxn]

;void

bfs()}

}}intmain()

// puts("");

printf

("%d"

,ans)

;return0;

}

寬度優先搜尋

include using namespace std const int n 700 const int inf 0x3f3f3f3f int dir 10 int n,a,b,ans 1000000 flag 0 int floor n struct node int check node tm...

寬度優先搜尋

寬度優先搜尋演算法 又稱廣度優先搜尋 是最簡便的圖的搜尋演算法之一,這一演算法也是很多重要的圖的演算法的原型。dijkstra單源最短路徑演算法和prim最小生成樹演算法都採用了和寬度優先搜尋類似的思想。其別名又叫bfs,屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說...

寬度優先搜尋

寬度優先搜尋也是搜尋的手段之一。它與深度優先搜尋類似,從某個狀態出發探索所有可以到達的狀態。const int inf 100000000 使用pair表示狀態時,使用typedef會更加方便一些 typedef pair p char maze max n max m 1 表示迷宮的字串陣列 in...