#include<bits/stdc++.h>
using namespace std;
queue<int>tui;
stack<int>song,hezi;
int n,m,k;
int main()
{
cin>>n>>m>>k;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
tui.push(x);
}
int cnt=0;
while(1)
{
while((int)song.size()<k)
{
int flag=0;
if(song.size()==0)
{
// cout<<"++"<<endl;
if(hezi.size()==0)
{
// cout<<"++"<<endl;
song.push(tui.front());
tui.pop();
}else{
song.push(hezi.top());
hezi.pop();
}
}else{
int flag1=0;
if(hezi.size())
{
int t=hezi.top();
if(t<=song.top())
{
song.push(t);
hezi.pop();
flag1=1;
}
}
if(flag1==0)
{
while(tui.size())
{
int t=tui.front();
if(t<=song.top())
{
song.push(t);
tui.pop();
break;
}else{
if(hezi.size()<m)
{
hezi.push(t);
tui.pop();
}
else{
flag=1;break;
}
}
}
if(tui.size()==0)flag=1;
}
}
if(flag)break;
}
cnt+=song.size();
vector<int>g;
while(song.size())
{
int t=song.top();
song.pop();
g.push_back(t);
}
reverse(g.begin(),g.end());
for(int i=0;i<g.size();i++)
{
if(i)cout<<' ';
cout<<g[i];
}
cout<<endl;
if(cnt==n)break;
}
}
本题是一个模拟题,因为题面长,所以之前不愿意去看,但是因为天梯赛会出模拟题,所以还是看了这道题。
思路:我想的是因为有每支成品结束的条件,所以我们以松枝干的大小作为循环来判断,至于大循环怎么结束,那就是松枝的数量等于n时就结束,我觉得这样很好理解。
我们按照题意模拟:
(1)当松枝干为空时,如果小盒子不为空,我们就从盒子的最上面取一个松枝,否则就从推送器上面取一个。
(2)当前的松枝干不为空,我们就先从小盒子最上面取(盒子不为空且必须小于等于松枝干的上一个),否则我们就从推送器上取,这块注意是while循环,因为我们要一直取,直到推送器为空或者小盒子满了或者找到了才结束,这块就有了这支松枝结束的条件(推送器为空或者小盒子满了),还有需要注意的点就是如果盒子满了我们要把从推送器上取出来的重新压回到推送器。
(3)最后根据每一次输出松枝干即可。