洛谷-UVA133 救濟金髮放 The Dole Queue

題目描述
在這裏插入圖片描述
輸入格式
在這裏插入圖片描述
輸出格式
在這裏插入圖片描述
題意翻譯
題目描述 n(n<20)個人站成一圈,逆時針編號爲 1~n。有兩個官員,A從1開始逆時針數,B從n開始順時針數。在每一輪中,官員A數k個就停下來,官員B數m個就停下來(兩個官員有可能能停在同一個人上)。接下來被官員選中的1個或2個人離開隊伍。

輸入格式 輸入n ,k ,m ,可能有多組數據,以 0 0 0結尾。

輸出格式 輸出每輪裏被選中的人的編號(如果有兩個人,先輸出被A選中的)。輸出的每個數應正好佔3列。樣例中的“ ␣ ”代表一個空格。

輸入輸出樣例
輸入 #1 複製
10 4 3
0 0 0
輸出 #1 複製
␣␣4␣␣8,␣␣9␣␣5,␣␣3␣␣1,␣␣2␣␣6,␣10,␣␣7


思路:用一個大於0的數字表示人站成圈,爲避免人走之後移動數據元素,用0 表示離開隊伍的人,數數時跳過即可。將順時針和逆時針的go函數整合在一個函數中。

#include<cstdio>
#include<iostream>
#define maxn 30
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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章