2020安徽程序设计省赛 G序列游戏

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; }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdgxg.html