uva 1452 dp 約瑟夫環

2021-07-04 15:19:04 字數 742 閱讀 1629

uva 1452 - jump

約瑟夫環。對於乙個n個人,沒k個踢出去的約瑟夫環。踢出乙個人後,環成了

0, 1, 2, ... ,k-2, k, k+1, ... ,n

對其從k為起點重新編號 

n-k+1, n-k+2, ... ,n-1, 0, 1, 2, ...n-k

這樣變成了乙個(n-1, k)的約瑟夫環問題。

於是得到轉移方程

dp[i] = (dp[i-1] + k) % i;

而題目還要去得出倒數第二個出去的和倒數第三個出去的。

其轉移如上,但是

初始化倒數第二個出去的 dp[2] = (k+1)%2;

初始化倒數第三個出去的 dp[3] = (k+2)%3;

#include int n, k;

int dp0[1000000+5];

int dp1[1000000+5];

int dp2[1000000+5];

int main ()

dp1[2] = (k+1)%2;

for (int i=3; i<=n; i++)

dp2[3] = (k+2)%3;

for (int i=4; i<=n; i++)

printf ("%d %d %d\n", dp2[n]+1, dp1[n]+1, dp0[n]+1);

} return 0;

}

UVA 1452 Jump 約瑟夫環變式

題目大意 給出n,m,約瑟夫環共n項,每數到m殺乙個人,問剩下的倒數第3個人 倒數第2個人 倒數第1個人的編號分別是多少 題解 因為我們都知道求約瑟夫環問題是f 1 0,f n f n 1 k i 所以一開始我的想法是就用同樣的方法來推倒數第2個人,f 2 0,f n f n 1 k i 但是得出的...

UVA133 約瑟夫環變種

為了縮短領救濟品的隊伍,nnglrp決定了以下策略 每天所有來申請救濟品的人會被放在乙個大圓圈,面朝裡面。選定乙個人為編號 1 號,其他的就從那個人開始逆時針開始編號直到 n。乙個 一開始逆時針數,數 k 個申請者,然後另乙個 第 n 個始順時針方向數 m 個申請者,這兩個人就被送去再教育。如果兩個...

數學小技巧 UVA 1394 約瑟夫環

約瑟夫環問題 詳解 約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依 此規律重複下去,直到圓桌周圍的人全部出列。通常解決這類問題時我們把編號從0 ...