题目描述
给定一个由n个元素构成的序列,你需要将其中的元素按顺序压入一个大小为c的栈并弹出。元素按它们的出栈顺序进行排列,会得到一个新的序列。我们知道,这样的序列会有很多种,请输出所有新序列中第一个元素最小的序列(若第一个元素最小的序列有多个,则令第二个尽可能小;若仍有多个,则令第三个最小,以此类推)。
输入格式
第一行,两个数n,c
第二行n个数,为序列中n个元素的值
输出格式
输出n个数,为满足要求的序列。
输入输出样例
输入 #1 复制
6 3
5 2 3 8 7 4
输出 #1 复制
2 3 5 4 7 8
说明/提示
对于40%的数据,n<=12
对于100%的数据,c<=n<=10000,元素大小均在2*10^9以内。
用栈模拟 栈栈栈
#include<bits/stdc++.h>
using namespace std;
#define N 10005
stack<long long>s;
long long a[N];
int main(){
int n, c, tmp, loc = 1, w = 2;
cin >> n >> c;
for(int i=1; i<=n; i++)
cin >> a[i];
s.push(a[1]);
while(loc <= n){//原序列
int x = w; //x:待入栈的第一个元素
if(s.empty()){//确保栈内有一个元素
s.push(a[x]);
x++;
}
int lens = s.size(), minp;//lens:栈的长度 minp:栈内最小元素的下标
int len = c - lens;//len:可入栈的元素个数
int tmp = s.top();//tmp:参考元素
for(int i=x; i<=x+len-1 && i<=n; i++){//在可入栈范围内找到最小值
if(a[i] < tmp){
minp = i;
tmp = a[i];
}
}
if(tmp != s.top()){//若最小值不是栈顶元素(其实栈内就也一个数)
for(int i=x; i<=minp; i++)//把最小元素前面的元素都入栈
s.push(a[i]);
w = minp+1;//w:待入栈的第一个元素
}
else{//栈顶就是c长度内的最小值
w = x;//x就是待入栈的第一个元素
}
loc++;//累计出去的数
cout << s.top() << " ";
s.pop();
}
while(!s.empty()){
cout << s.top() << " ";
s.pop();
}
return 0;
}