c++【题目描述】 给你一个长度为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 3
时间: 2024-04-16 21:25:28 浏览: 70
题目描述:
给定一个长度为n的排列a,一个空的栈s和一个空的数组b,每次可以执行以下两种操作之一:
1. 将数组a的第一个元素压入栈s中
2. 如果栈s非空,则将栈顶元素弹出并追加到数组b的末尾
最终要求将数组a中的所有元素移动到数组b中,并使得数组b的顺序是字典序最小的。
输入文件:out.in
第一行输入一个正整数n(1≤n≤100)。
第二行输入n个整数,表示排列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 3
相关问题
题目描述 已知元素从小到大排列的两个数组x[]和y[],请写出一个程序算出两个数组彼此之间差的绝对值中最小的一个,这叫做数组的距离 输入 第一行为两个整数m, n(1≤m, n≤1000),分别代表数组f[], g[]的长度。 第二行有m个元素,为数组f[]。 第三行有n个元素,为数组g[]。 输出 数组的最短距离 样例输入 5 5 1 2 3 4 5 6 7 8 9 10 样例输出 1 C语言
下面是 C++ 的代码实现,使用双指针法,在两个数组中分别设置指针 i 和 j,根据差值的绝对值来移动指针,直到两个指针分别达到数组的末尾。时间复杂度为 O(m+n)。
```c++
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main() {
int m, n;
cin >> m >> n;
int x[m], y[n];
for (int i = 0; i < m; i++) {
cin >> x[i];
}
for (int j = 0; j < n; j++) {
cin >> y[j];
}
sort(x, x + m);
sort(y, y + n);
int i = 0, j = 0, ans = abs(x[0] - y[0]);
while (i < m && j < n) {
ans = min(ans, abs(x[i] - y[j]));
if (x[i] < y[j]) {
i++;
} else {
j++;
}
}
cout << ans << endl;
return 0;
}
```
问题描述: 蒜头君有一个长度为 n 的序列 a1,a2,⋯,an,现在他有 m 个问题要问你,每次给你一对 1≤l≤r≤n ,求 al,a(l+1),⋯,ar 的 mex 的值。 mex 的值定义为该序列中最小未出现过的自然数。 数据范围: 1≤n,m≤10^5 al,a(l+1),⋯,ar 为 0∼n−1 的一个排列。 输入格式: 第一行两个整数 n, m 第二行 n 个整数,表示 a1,a2,⋯,an 接下来 m 行,每行两个整数,分别对应每次询问的 l 和 r 输出格式: 对于每一次询问,输出一行一个整数,表示对应的 mex 值。 这道题目是一个区间 mex 的问题。我们可以用线段树来解决。 基本思路是: 对于线段树的每个节点,维护一个桶,桶的下标为0 ~ n-1的整数,表示这个整数在当前区间中出现过的次数。 每次进行区间查询,我们遍历这个区间,找到第一个桶中值为0的整数,即为mex值. 该算法的时间复杂度为O(nlog(n)) C++代码
这道题目需要我们求区间 mex 值,即区间中最小未出现过的自然数。我们可以使用线段树来解决这个问题。
思路如下:
- 首先建立线段树,对于每个节点维护一个桶,桶的下标为0 ~ n-1的整数,表示这个整数在当前区间中出现过的次数。
- 对于区间查询,遍历这个区间,找到第一个桶中值为0的整数,即为mex值。
这种算法的时间复杂度为O(nlog(n))。C语言实现代码可以参考给出的代码。
阅读全文