//两个while嵌套 用if语句+break跳出 根据当下这枝松枝是否为空来分情况
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
int n,m,k;
stack<int>s;//小盒子
queue<int>q;//传送带
int main(){
cin>>n>>m>>k;
for(int i=0;i<n;i++){
int x;cin>>x;
q.push(x);
}
while(1){
vector<int>v;//松枝
int flag=0;//小盒子是否满了
//进行一次松枝制作
while(1){
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()){//先看小盒子 若不为空 且满足条件
v.push_back(s.top()),s.pop();
}
else{//否则就去传送带上寻找
while(!q.empty()&&s.size()<=m){//若不空 且 小盒子没满
int t=q.front();
if(t<=v.back()){
v.push_back(t);
q.pop();
break;
}
else{
if(s.size()==m){
flag=1;//标记为满了
break;
}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];
}
cout<<endl;
if(s.empty()&&q.empty()) break;//都是空的 退出大while
}
return 0;
}
主要还是模拟的思想 栈和队列只是最最最基本的操作
这俩就相互对应 while说的是传送带不空 且 小盒子没满 寻找满足的元素
之后的if说的是传送带空 且 小盒子是空 或者 小盒子的栈顶不满足