题目传送门
针对模拟画了一个草图:
我是遍历的推送器,那么有一个需要注意的点是如果推送器遍历完了栈中还有元素的话,那么还要对栈里的元素进行处理。
关于格式这里先把所有的元素存入vector中,如果需要换行则push_back一个0,最后统一按格式输出
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
#define debug(x) cout<<"#x = "<<x<<endl;
const int N = 1E3+5;
int a[N];
stack<int>sk;
int n, m ,k;
int last = 110;
int cnt;
vector<int>v;
void sc(int x)
{
cnt++;
if(cnt == m)
{
v.push_back(x);
v.push_back(0);
last = 110;
cnt = 0;
}
else
{
v.push_back(x);
last = x;
}
}
void solve(int x)
{
while(sk.size() && sk.top() <= last)
{
int t = sk.top();
sc(t);
sk.pop();
}
if(x <= last) sc(x);
else
{
if(sk.size() < k) sk.push(x);
else
{
v.push_back(0);
cnt = 0;
last = 110;
solve(x);
}
}
}
int main()
{
cin>>n>>k>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
{
int x = a[i];
if(sk.empty())
{
if(x <= last) sc(x);
else sk.push(x);
}
else solve(x);
}
while(sk.size())
{
if(sk.top() <= last)
{
sc(sk.top());
sk.pop();
}
else
{
v.push_back(0);
cnt = 0;
last = 110;
}
}
for(int i=0;i<v.size();i++)
{
if(v[i] == 0) continue;
cout<<v[i];
if(i<v.size()-1)
{
if(v[i+1] == 0) cout<<endl;
else cout<<" ";
}
else cout<<endl;
}
return 0;
}