開啟章節選單

10935 Throwing cards away I

題目連結

題目翻譯

有一副由 1 到 n 編號的牌,牌 1 在最上面、牌 n 在最下面。只要牌堆裡還有至少兩張牌,就重複以下操作:丟掉最上面的那張牌,然後把新的最上面那張牌移到牌堆最下面。請求出被丟棄的牌的順序,以及最後剩下的那張牌。

輸入

每行輸入一個整數 n(n ≤ 50),最後一行為 0,代表輸入結束,不需處理。

輸出

對每個 n,輸出兩行:第一行依序列出被丟棄的牌,第二行輸出最後剩下的牌,格式與範例完全相同(逗號後方有空白、行首行尾不留多餘空白)。

解題思路

直接用 queue 模擬整個過程即可:每次把隊首的牌彈出並記錄為丟棄,接著把新的隊首搬到隊尾,重複直到 queue 裡只剩一張牌,該牌即為答案。

程式碼

//author:Piau
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define WA() cin.tie(0)->sync_with_stdio(0)

signed main() { WA();
    for (int n; cin >> n, n;) {
        queue<int> q;
        for (int i = 1; i <= n; i++) q.push(i);
        vector<int> ans;
        while (q.size() > 1) {
            ans.pb(q.front()); q.pop();
            q.push(q.front()); q.pop();
        }
        cout << "Discarded cards:";
        for (int i = 0; i < ans.size(); i++) cout << (i ? ", " : " ") << ans[i];
        cout << "\nRemaining card: " << q.front() << '\n';
    }
}