#include <bits/stdc++.h>
#define endl '\n'
#define INF 0x3f3f3f3f
#define ll long long
#define pb push_back
#define Mirai ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
using namespace std;
int n, m, k;
queue<int> q; // 推送器
stack<int> s; // 盒子
void solve()
{
while (1)//此处每次循环输出一个已完成的松枝干
{
vector<int> v;
bool flag = 0;//flag用来判断盒子是否已经满了
while (1)//此处每次循环往松枝干中插入一个松枝,此处循环里的所有break都将跳出然后输出当前松枝干
{
if (v.empty())//当前松枝干为空
{
if (!s.empty())//盒子不为空
{
v.push_back(s.top());
s.pop();
}
else if (!q.empty())//盒子为空,推进器不为空
{
v.push_back(q.front());
q.pop();
}
else//盒子和推进器都为空则制作完成
{
break;
}
}
else//当前松枝干不为空
{
if (!s.empty() && s.top() <= v.back())//先从盒子中取,如果盒顶松枝满足要求
{//因为此层循环循环一次是往松枝干中插入一个松枝,所以不用while遍历盒顶元素
v.push_back(s.top());
s.pop();
}
else//盒顶元素不合法
{
while (!q.empty() && s.size() <= m)//按照此层循环的意义所以找出合法的松枝
{//如果当前推进器上还有松枝并且当前盒子中的松枝数合法
int t = q.front();//取出推进器的松枝
if (t <= v.back())//如果松枝大小合法
{
q.pop();
v.push_back(t);
break;//此处的break说明不用再找了
}
else//如果不合法
{
if (s.size() == m)//此处的情况为推进器上的松枝不合法
//并且当前还没放的时候盒子就已经满了(情况1)
{
flag = 1;
break;//对应了情况1,break之后通过flag判断弹出
}
else//放完之后盒子满了仍然可以进入下一此循环因为下一个数可能合法
{ // 不满足,放到栈顶去
s.push(t);
q.pop();
}
}
}
if (q.empty() && (s.empty() || s.top() > v.back()))
{ //双空或者推进器空并且盒顶元素不合法
break;
}
}
}
if (flag || v.size() == k)
{ // 如果盒子满了 或者松枝插满了
break;
}
}
// 输出
for (int i = 0; i < v.size(); i++)
{
if (i != v.size() - 1)
{
cout << v[i] << ' ';
}
else
{
cout << v[i] << endl;
}
}
if (s.empty() && q.empty())//双空,制作完成
{
break;
}
}
}
int main()
{
cin >> n >> m >> k;
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
q.push(x);
}
solve();
return 0;
}
L2模拟简直坐牢
就这样吧真浪费时间