L2-041插松枝(STL模拟 , 别急后面还有更难的STL模拟)

本题传送门
这题来了个大的!

FB70319368DD30C13F9483A285F0CD01

解题思路

这道题拿松枝的顺序是:

游戏规则为: 每次插入的松枝不能大于上一个插入的松枝。

  1. 先拿盒子里的松枝,如果盒子里的松枝不满足要求(或者为空),就从推送器上拿一个, 如果还不满足要求,就把推送器上拿的这个放在小盒子里(前提是盒子没满),再从推送器上拿一个。

  2. 如果现在小盒子里的不满足要求,而小盒子又满了,同时推送器上的也无法正确插入,就完成一根松枝的制作

  3. 如果一根松枝已经被插满了,就完成一根松枝的制作

  4. 如果小盒子上的不满足要求,而推送器又空了,就完成一根松枝的制作

-------------————————————————————————----------------————————————————————
所以总的来说取的顺序是,先取小盒子,再取推送器,若是两个都没有成功的插入松枝,就完成一个松枝的制作。

这里又要用到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;   
}

奶龙

posted @ 2026-03-17 15:31  shuiwangrenjia  阅读(5)  评论(0)    收藏  举报