題目描述
n 個人的編號是 1 ~ n,如果他們依編號按順時針排成乙個圓圈,從編號是1的人開始順時針報數。
(報數是從 1 報起)當報到 k 的時候,這個人就退出遊戲圈,下乙個人重新從 1 開始報數。
求最後剩下的人的編號。這就是著名的約瑟夫環問題。
本題目就是已知 n,k 的情況下,求最後剩下的人的編號。
輸入格式
題目的輸入是一行,2 個空格分開的整數 n, k
輸出格式
要求輸出乙個整數,表示最後剩下的人的編號。
樣例輸入
10 3
樣例輸出4
資料範圍
0 < n, k < 105
題解一
佇列(會超時):
#include
#include
using
namespace std;
queue<
int> q;
intmain()
else}
cout << q.
front()
<< endl;
return0;
}
題解二
遞推:
f[i]
:有i
個人參加遊戲時,剩下的人的編號(下標從 0 開始)。
由於下標從 0 開始,所以報k
的是第k-1
個人。從下乙個人開始,所有人重新從 0 開始編號,比如第k
個人的編號變為0
,…
那麼問題就轉變成:有i-1
個人參加遊戲,剩下的人的編號,即f[i - 1]
。
原編號與新編號相差k
,所以f[i] = f[i - 1] + k
,又因為編號不能超過人數,所以還要% i
。
#include
using
namespace std;
int f[
1000010];
intmain()
第九屆藍橋盃國賽參賽體會
第一題,74,嗯,水題,做錯了,看成了一塊的是兩塊的10倍。第二題,暴力跑一分半,或者找一下規律,沒錯,就是斐波那契數列。第三題,格雷碼,樹狀陣列,我都沒學過這個東西,我用了幾個三目運算子,後來大大佬說這樣會錯,不滿足n 5的情況,emmmm。第四題,複雜度o n 我o n 2 emmmm,我怎麼這...
第九屆藍橋盃國賽 調手錶
小明買了塊高階大氣上檔次的電子手錶,他正準備調時間呢。在 m78 星雲,時間的計量單位和地球上不同,m78 星雲的乙個小時有 n 分鐘。大家都知道,手錶只有乙個按鈕可以把當前的數加一。在調分鐘的時候,如果當前顯示的數是 0 那麼按一下按鈕就會變成 1,再按一次變成 2 如果當前的數是 n 1,按一次...
第九屆藍橋杯(國賽) 調手錶
問題描述 小明買了塊高階大氣上檔次的電子手錶,他正準備調時間呢。在 m78 星雲,時間的計量單位和地球上不同,m78 星雲的乙個小時有 n 分鐘。大家都知道,手錶只有乙個按鈕可以把當前的數加一。在調分鐘的時候,如果當前顯示的數是 0 那麼按一下按鈕就會變成 1,再按一次變成 2 如果是 n 1,那麼...