第九屆藍橋杯(國賽) 調手錶

2021-10-23 15:55:26 字數 2285 閱讀 5648

問題描述

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

在 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 ≤ 105

題解

bfs:

#include

#include

#include

using

namespace std;

const

int n =

100010

;int d[n]

;int n, k;

void

bfs(

)int b =

(t + k)

% n;

if(d[b]==-

1)}}

intmain()

錯解一:60% ~ 70%的分數

剛開始沒看懂題目,瞎寫一通,居然有這麼多分數?,所以題目不會做也不要空著hh。

#include

using

namespace std;

intmain()

} cout <<

0<< endl;

return0;

}

錯解二

完全揹包:

大概 50% 左右的分數

當 n = 10,k = 8 時,如果想調到 6 這個時刻,按照完全揹包的做法至少要 6 步;但如果進行兩次 +8 再 % 10,只需要 2 次。

#include

#include

using

namespace std;

int f[

100010];

intmain()

;memset

(f,0x3f

,sizeof f)

;

f[0]

=0;for

(int i =

0; i <

2; i ++

)for

(int j = w[i]

; j < n; j ++

) f[j]

=min

(f[j]

, f[j - w[i]]+

1);int ans =0;

for(

int i =

1; i < n; i ++

) ans =

max(ans, f[i]

);

cout << ans << endl;

return0;

}

第九屆藍橋盃國賽 調手錶

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

藍橋杯第九屆國賽B組 第四題 調手錶

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

第九屆藍橋盃國賽參賽體會

第一題,74,嗯,水題,做錯了,看成了一塊的是兩塊的10倍。第二題,暴力跑一分半,或者找一下規律,沒錯,就是斐波那契數列。第三題,格雷碼,樹狀陣列,我都沒學過這個東西,我用了幾個三目運算子,後來大大佬說這樣會錯,不滿足n 5的情況,emmmm。第四題,複雜度o n 我o n 2 emmmm,我怎麼這...