救濟金發放(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。注意:輸出的每個數應當恰好占3列。

#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+n-1) % n + 1; } while(a[p] == 0); //走到下一個非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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM