2020安徽程式設計省賽 G序列遊戲
阿新 • • 發佈:2021-01-07
2020安徽程式設計省賽 G序列遊戲
有一個序列w,初始為空。再給出一個長度為m 單調遞增的序列a。你需要對序列w 作如下n 次操作:
(1)操作0,在序列尾部新增數字0。
(2)操作1,在序列尾部新增數字1.
(3) 操作-1,刪除序列w 中,所有位於位置ai 的數(1<=i<=m)。比如a={1,3,5},就將w 中第1,3,5 個數刪除。若ai>w 的當前長度,則該操作停止。輸出n 次操作後的序列w。
解題思路:
該題根據題目描述,可以直接定義三個操作對應的函式處理使用者輸入即可。
具體解法:
首先從題目的條件入手,讓使用者輸入兩個整數n和m,然後輸入m個整數作為序列a,後面有n行整數分別代表不同的操作。
使用STL向量容器儲存w和a序列。0和1操作可直接使用庫函式push_back進行序列值的新增,定義deleteSequence函式執行從序列w中刪除a序列值對應位置的元素,在刪除前進行合法性判斷。執行完操作後的w序列即為答案。
#include <iostream> #include <vector> using namespace std; void printSequence(const vector<int>& a) { for(auto it : a) { cout << it; } cout << endl; } void deleteSequence(vector<int>& w, const vector<int>& a) { bool flag = false; for(auto it : a) { if(it <= w.size()) { int n = it; if(flag) { n--; } w.erase(w.begin() + (n - 1)); flag = true; } else { flag = false; } } } int main() { vector<int> w, a; int n, m, op, temp; cin >> n; cin >> m; for(int i = 0; i < m; i++) { cin >> temp; a.push_back(temp); } while(n > 0) { cin >> op; switch(op) { case 0: w.push_back(0); break; case 1: w.push_back(1); break; case -1: deleteSequence(w, a); break; default: cout << "輸入有誤,請重新輸入(0, 1, -1)!" << endl; continue; } n--; } if(w.empty()) { cout << "Poor stack!" << endl; return 0; } printSequence(w); return 0; }