P1750 出栈序列
题目描述
给定一个由 n n n 个元素构成的序列,你需要将其中的元素按顺序压入一个大小为 c c c 的栈并弹出。元素按它们的出栈顺序进行排列,会得到一个新的序列。我们知道,这样的序列会有很多种,请输出所有新序列中第一个元素最小的序列(若第一个元素最小的序列有多个,则令第二个尽可能小;若仍有多个,则令第三个最小,以此类推)。
输入格式
第一行,两个整数 n , c n, c n,c。
第二行, n n n 个数,为序列中 n n n 个元素的值。
输出格式
输出 n n n 个数,为满足要求的序列。
输入输出样例 #1
输入 #1
6 3
5 2 3 8 7 4
输出 #1
2 3 5 4 7 8
说明/提示
对于
40
%
40 \%
40% 的数据,
n
≤
12
n \le 12
n≤12;
对于
100
%
100 \%
100% 的数据,
1
≤
c
≤
n
≤
10000
1 \le c \le n \le 10000
1≤c≤n≤10000,元素大小均在
[
1
,
2
×
10
9
]
[1, 2 \times {10}^9]
[1,2×109] 内。
C++实现
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
stack <int> a;
int nn[10001],n,c,in=0,whe=1,i,m=0;
int main()
{
cin>>n>>c;
for(i=1;i<=n;i++)
{
scanf("%d",&nn[i]);
}
while( a.size() + m < n ) {
in=a.size();//栈内元素数量
int minn=0x7fffffff,wher=whe,len=c-in;
for(i=wher;i<wher+len && i<=n;i++)
if(nn[i]<minn) {
whe=i;
minn=nn[i];
}
if ( a.empty() || minn <= a.top() ) {
for(int i=wher;i<=whe;i++) a.push(nn[i]);
++whe;
}
else whe=wher;
cout<<a.top()<<' ';
m++;
a.pop();
}
while(!a.empty()) {
cout<<a.top()<<' ';
m++;
a.pop();
}
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容