天梯赛练习集L2-041 插松枝(模拟)

#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)最后根据每一次输出松枝干即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值