L2-041插松枝(STL模拟 , 别急后面还有更难的STL模拟)
本题传送门
这题来了个大的!

解题思路
这道题拿松枝的顺序是:
游戏规则为: 每次插入的松枝不能大于上一个插入的松枝。
-
先拿盒子里的松枝,如果盒子里的松枝不满足要求(或者为空),就从推送器上拿一个, 如果还不满足要求,就把推送器上拿的这个放在小盒子里(前提是盒子没满),再从推送器上拿一个。
-
如果现在小盒子里的不满足要求,而小盒子又满了,同时推送器上的也无法正确插入,就完成一根松枝的制作
-
如果一根松枝已经被插满了,就完成一根松枝的制作
-
如果小盒子上的不满足要求,而推送器又空了,就完成一根松枝的制作
-------------————————————————————————----------------————————————————————
所以总的来说取的顺序是,先取小盒子,再取推送器,若是两个都没有成功的插入松枝,就完成一个松枝的制作。
这里又要用到last变量来记录上一个插入的松枝的大小
-
从小盒子里拿时,先要判空,如果空就跳到对推送器的判断,如果不空就拿一个,如果比last小,插入并更新,如果大,就放回去(从一开始就不拿),再跳到对推送器的判断
-
从推送器上拿时,也要先判空(只要访问容器的时候都一定要判空),如果空了,进行下一个松枝的制作,如果不空,再拿一个,如果不满足插入要求,就放进小盒子里,但是如果小盒子是满的,就进行下一个的制作,如果可以放得下,就放进去,再从推送器上拿一个,可以想到,推送器中break的条件就是:①小盒子满了 ②推送器空了
ac✅️代码
#include<iostream>
#include<stack>
#include<queue>
#include<vector>
using namespace std;
int main()
{
int n,m,k;
cin>>n>>m>>k;
queue<int> q;
for(int i = 0 ;i < n ; i ++)
{
int x;cin>>x;
q.push(x);
}
stack<int> s;
while(s.size() || q.size())//只要有一个没空都能继续插
{
vector<int> res;
int last = 1e9;
while(res.size() < k)
{
//什么时候能用到小盒子
if( s.size() && s.top() <= last)
{
last = s.top();
s.pop();
res.push_back(last);
}
//如果不行,再看推进器
else if(q.size())
{
int cur = q.front();
if(cur <= last)
{
last = cur;
q.pop();
res.push_back(last);
}
else if(s.size() < m )
{
s.push(cur);
q.pop();
}
else
{
break;
}
}
//如果小盒子和推进器都不可以,开始下一个松枝
else break;
}
for(int i = 0 ; i < res.size() ; i ++)
{
cout<<res[i];
if(i != res.size() - 1) cout<<" ";
}
cout<<"\n";
}
return 0;
}


浙公网安备 33010602011771号