【题目描述】 给你一个长度为n的排列a,一个空的栈s和一个空的数组b,你每次可以做两种操作中的一种: 将数组a最前面的数压到栈s中 如果栈s中有数,将栈顶元素弹到b的末尾 最终你需要使得a中没有数且栈s中的数也全部弹到b中,请问构成字典序最小的b是什么。 【输入文件】 out.in 第一行输入一个正整数n(1≤n≤100)。 第二行输入a(1≤a[i]≤n,且所有a[i]不相同)。 【输出文件】 out.out 输出字典序最小的b。 【样例输入1】 3 2 3 1 【样例输出1】 1 3 2 【样例输入2】 3 3 1 2 【样例输出2】 1 2 3c++代码
时间: 2024-04-16 12:25:23 浏览: 55
以下是一个用C++编写的解决方案:
```cpp
#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
vector<int> b;
stack<int> s;
for (int i = 0; i < n; i++) {
while (!s.empty() && s.top() < a[i]) {
b.push_back(s.top());
s.pop();
}
s.push(a[i]);
}
while (!s.empty()) {
b.push_back(s.top());
s.pop();
}
for (int i = 0; i < n; i++) {
cout << b[i] << " ";
}
return 0;
}
```
该程序首先读取输入的n和排列a。然后使用一个栈s和一个数组b来模拟操作过程。遍历排列a,对于每个元素,将小于它的栈顶元素弹出并追加到数组b的末尾,然后将当前元素压入栈s中。最后,将栈s中剩余的元素依次弹出并追加到数组b的末尾。最终,输出数组b即为字典序最小的结果。
注意:这只是一个解决方案示例,可能还有其他方法可以得到相同的结果。
阅读全文