為了縮短領救濟品的隊伍,nnglrp決定了以下策略:每天所有來申請救濟品的人會被放在乙個大圓圈,面朝裡面。選定乙個人為編號 1 號,其他的就從那個人開始逆時針開始編號直到 n。乙個**一開始逆時針數,數 k 個申請者,然後另乙個**第 n 個始順時針方向數 m 個申請者,這兩個人就被送去再教育。如果兩個**數的是同乙個人,那個人則被送去從政,然後2個**再在剩下的人裡面繼續選直到沒人剩下來,注意兩個被選 中的人是同時走掉的,所以就有可能兩個**選中乙個人。
輸入含有多組測試資料,每組測試資料一列含有三個數 n,k 和 m(k, m > 0,0對每組測試資料輸出一列。輸出被選中的申請者的編號順序(一對一對的)。每個數的寬度為 3 。每一對前面的那個編號為逆時針數的**選出的,後面的那個編號為順時針數的**選出的(但是如果這2個**選出同乙個人,那就只會有乙個編號)。每一對 之間以逗號分開。格式請參考sample output。
10 4 313 17 42
7 8 47
0 0 0
4 8, 9 5, 3 1, 2 6, 10, 74 11, 10 1, 8 6, 13 7, 3, 5 12, 9 2
1 3, 5 7, 2 4, 6
解析:模擬,但座標變換非常重要。
兩套**:
#include usingnamespace
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...