这题难点在于需要大量的重复操作,某一步做完之后,又要从头再开始
1.使用while循环
2.使用数组代替stack vector → 原因:vector和stack可能为空,但是又要参与比较,容易报错
#include <bits/stdc++.h>
using namespace std;
int mat[1005], ms=0; //松枝 Matsueda, ms是松枝插到哪里,也是松枝的容量
int box[1005], bs=0; //盒子
int arr[5005], s=0; //推进器
int n,m,k;
void print(){
for(int i=1;i<=ms;i++){
if(i == ms)
cout << mat[ms] << endl;
else{
cout << mat[i] << " ";
mat[i] = 0;
}
}
ms = 0;
}
int main()
{
cin >> n >> m >> k; //m是小盒子max容量,k是松枝max容量
for(int i=1;i<=n;i++){
cin >> arr[i];
}
mat[0] = 1e9;
while(s<=n || ms!=0 || bs!=0){
if(ms == k) print();
else{
if(bs!=0 && box[bs] <= mat[ms]){ //先看小盒子的是否符合要求
mat[++ms] = box[bs--];
}
else{
int tmp = arr[++s]; //从推进器上取一根松枝
if(s > n){ //推进器的松枝取完了,还不符合要求
print();
}
else if(tmp <= mat[ms]){//推进器上的符合要求
mat[++ms] = tmp;
}
else if(bs == m){ //推进器的不符合要求,小盒子还满了 -> 压回推进器
print();
s--;
}
else if(bs < m){ //推进器的不符合要求,小盒没满 -> 压到小盒子
box[++bs] = tmp;
}
}
}
}
return 0;
}