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