小明買了塊高階大氣上檔次的電子手錶,他正準備調時間呢。在 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
思路:這題考察了bfs的應用。需要轉化一下任意點到任意點,可以看作從0到任意點。
但是需要注意:
可以值進行一次bfs,同時把從0到其他所有點的最短距離記錄下來(多次bfs會超時)。
此外需要利用vis資料標記哪些點在佇列,防止重複入隊。
code:
#include#include#includeusing namespace std;
const int n = 1e5+5;
const int int = 0x3f3f3f3f;
int n,k;
bool vis[n];
struct p
p(int pp, int ss) :pos(pp),step(ss){}
};int num[n];
void bfs(int s)
nex = (cur.pos+k)%n;
if(!vis[nex]) }}
int main()
printf("%d\n",ans);
return 0;
}
第四屆藍橋杯C B組 高斯日記
大數學家高斯有個好習慣 無論如何都要記日記。他的日記有個與眾不同的地方,他從不註明年月日,而是用乙個整數代替,比如 4210 後來人們知道,那個整數就是日期,它表示那一天是高斯出生後的第幾天。這或許也是個好習慣,它時時刻刻提醒著主人 日子又過去一天,還有多少時光可以用於浪費呢?高斯出生於 1777年...
2023年藍橋杯C B組決賽題目彙總
a 村的元宵節燈會上有一迷題 請猜謎 請猜謎 請邊賞燈邊猜 小明想,一定是每個漢字代表乙個數字,不同的漢字代表不同的數字。請你用計算機按小明的思路算一下,然後提交 請猜謎 三個字所代表的整數即可。請嚴格按照格式,通過瀏覽器提交答案。注意 只提交乙個3位的整數,不要寫其它附加內容,比如 說明性的文字。...
2016藍橋杯A組java第四題
分小組9名運動員參加比賽,需要分3組進行預賽。有哪些分組的方案呢?我們標記運動員為 a,b,c,i 下面的程式列出了所有的分組方法。該程式的正常輸出為 abc def ghi abc deg fhi abc deh fgi abc dei fgh abc dfg ehi abc dfh egi ab...