1. 程式人生 > >救濟金髮放(The Dole Queue,UVa 133)

救濟金髮放(The Dole Queue,UVa 133)

救濟金髮放

問題描述
n(n<20)個人站成一圈,逆時針編號為1~n。有兩個官員,A從1開始逆時針數,B從n開始順時針數。在每一輪中,官員A數k個就停下來,官員B數m個就停下來(注意有可能來兩個官員停在同一人上)。接下來被官員選中的人(1個或者2個)離開隊伍。
輸n,k,m,輸出每輪裡被選中的人的編號(如果有兩個人,先輸出被A選中的)。例如,n=10,k=4,m=3,,輸出為4 8,9 5, 3 1,2 6,10 7。注意,輸出的每數應當 恰好佔三列。

#include <stdio.h>
#define maxn 25

int n, k, m, a[maxn];
// 逆時針走t步,步長是d(-1
表示順時針走),返回新位置 int go (int p, int d, int t) { while (t--) { do { p = (p+d-1+n) % n + 1; } while (a[p] == 0); } return p; } int main() { while (scanf("%d%d%d", &n, &k, &m) == 3 && n) { for (int i = 1; i <= n; i++) a[i]= i; int
left = n; //還剩下的人數 int p1 = n, p2 = 1; while (left) { p1 = go(p1, 1, k); p2 = go(p2, -1, m); printf("%3d", p1); left--; if (p2 != p1) { printf("%3d", p2); left--; } a[p1] = a[p2] = 0
; if (left) printf(", "); } printf("\n"); } return 0; }