開啟章節選單
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'; } }