ACM題目:救濟金髮放
阿新 • • 發佈:2018-12-26
思路:
1. 使用陣列que記錄在隊伍中的人,陣列索引範圍是 1~n;
2. 用book標記離開隊伍的人
3.用 left 記錄隊伍剩下的人數,left=0的時候,就可以結束迴圈;
3.分別從que[p]按順序,que[q]按逆序遍歷陣列que,(初始化的時候p=0,q=n+1)。
為了防止q和p超出陣列索引範圍,可以用取餘數的方法:
1. 順序讀取: p = (p-1+n-1)% n + 1;
2. 逆序讀取: q = (q+1+n-1)% n + 1;
(例如n=5,則
p=1,2,3,4,5,1,2,3,4,5,1......
q=5,4,3,2,1,5,4,3,2,1,5......
)
區別在於: 順序的時候為p-1,逆序的時候為p+1;
#include<iostream> using namespace std; int main() { int que[100]; //存放環狀陣列 bool book[100] = { 0 }; //標記已經離開隊伍的人物 int n, i, M, N; cin >> n; // 人數 if (n == 0)return 0; cin >> M >> N; for (i = 1; i <= n; i++) que[i] = i; int p = 0, q = n + 1; int left = n; // 隊伍剩下的人數 while (left) { int t = M; //需要走的步數 while (t) { p = (p + 1 + n - 1) % n + 1; // 向順序移動一位 if (book[p] == 0) t--; //判斷是否可走 } t = N; while (t) { q = (q - 1 + n - 1) % n + 1; // 向逆序移動一位 if (book[q] == 0) t--;//判斷是否可走 } book[p] = 1; book[q] = 1; if (p != q) { cout << que[p] << que[q] << ","; left -= 2; } else { cout << que[q] << ","; left--; } } return 0; }