UVA133 約瑟夫環變種

2022-01-19 14:35:01 字數 1452 閱讀 4735

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

輸入含有多組測試資料,每組測試資料一列含有三個數 n,k 和 m(k, m > 0,0對每組測試資料輸出一列。輸出被選中的申請者的編號順序(一對一對的)。每個數的寬度為 3 。每一對前面的那個編號為逆時針數的**選出的,後面的那個編號為順時針數的**選出的(但是如果這2個**選出同乙個人,那就只會有乙個編號)。每一對 之間以逗號分開。格式請參考sample output。

10 4 3 

13 17 42

7 8 47

0 0 0

4 8, 9 5, 3 1, 2 6, 10, 7 

4 11, 10 1, 8 6, 13 7, 3, 5 12, 9 2

1 3, 5 7, 2 4, 6

解析:模擬,但座標變換非常重要。

兩套**:

#include using

namespace

std;

intn,k,m;

int a[30

];int go(int p,int d,int

t)while(a[p]==0

); }

returnp;}

main()

a[p1]=a[p2]=0

;

if(left)

cout

<<","

; }

cout

<}

}

更易於理解的**:
#include#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const

int maxn=30

;int

vis[maxn];

intn,k,m;

intmain()

while(1

)

if(ki==mi)

else

cntk=0,cntm=0

; }

cout

<}

}

uva 133解題報告

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

救濟金發放(uva 133)

n個人占城一圈,逆時針編號為1 n.有兩個 a從1開始逆時針數,b從n順時針開始。在每一輪中,a數k個數就停下來,b數m個就停下來 注意有可能連個 停在同乙個人上 接下來被 選中的人離開隊伍。輸入n,k,m輸出每輪裡被選中的人的編號 如果有兩個人 先輸出被a選中的 注意 輸出的每個數應當恰好佔3列。...

UVa 133 救濟金發放

這題的話,我們首先對於移動函式可以知道,因為只是順逆的關係,也就是加一或者減一,所以我們每次移動的時候,都補上乙個小於n的最大整數,然後取模,這樣就不會有負數,而且加之後的結果不會超過2 n,所以我們取模的結果就是0到n 1,然後加上1就可以得到原位置了。題目中的逆時針就是加一,順時針就是減一。in...