2022天梯赛L2-1插松枝

题目

题目描述

在这里插入图片描述

样例输入

8 3 4
20 25 15 18 20 18 8 5

样例输出

20 15
20 18 18 8
25 5

浅谈总结

这里我就放上截图吧,在开始写题解之前我想先写一下我的感受,我没有想到最后自己的天梯赛的结果竟然是这样,我在这道题上纠结了将近一个半小时。事后老师建立起复现赛之后我根据当时的代码稍微改了一下,交了之后过了,当时只过了一分,可能还是我自己能力不足吧。
虽然竞赛结束了,但是人生并没有结束,但我觉得重要的并不是拿不拿奖,是能不能从这样一次次的实践中收获经验和教训吧,以后我会引以为戒,也希望能看到这篇文章的各位能引以为戒。
我觉得最主要的点还是要正确地模拟这个过程,具体要使用的是while还是if是需要好好想一下的,而不能想当然的就写了上去。
具体需要注意的地方我都写到代码的注释里了。

代码

#include <bits/stdc++.h>

using namespace std;
const int maxn=100005;
int n,m,k,s;
int u,v,w;

queue<int> qus[1005];//表示每个玩具
stack<int> he;//表示篮子
queue<int> qu;//表示传送带

int main()
{

    int zan;
    cin>>n>>m>>k;
    for(int i=1; i<=n; i++)
    {
        cin>>zan;
        qu.push(zan);//将值送入传送带
    }
    for(int i=0; i<=1000; i++)
    {
        qus[i].push(200);//预添加一个比较大的值,这样就不用判断当前玩具空的情况了额,最后只要不输出这个元素就行了
    }
    int cnt=0;
    zan=0;
    while(true)
    {
        if(qu.empty()&&he.empty())//如果传送带上和盒子里面都没有松枝了,退出
        {
            cnt++;
            break;
        }
        if((int)qus[cnt].size()==(k+1))//如果当前的玩具上松枝数量到上限了,换下一个玩具
            cnt++;
        if(!he.empty())//先看盒子里面空不空
        {
            zan=he.top();//拿出盒子里最上层的值
            if(zan>qus[cnt].back())//判断这个值和当前玩具上松针的大小关系
            {
                if(qu.empty())//如果这时候传送带空了,那就只能选下一个玩具了
                    cnt++;
                while(!qu.empty())//一直在传送带上取,直到从传送带上取下值了或者传送带上的值已经被取完了或者此时盒子已经满了
                {
                    zan=qu.front();
                    if(zan<=qus[cnt].back())//取到值了
                    {
                        qus[cnt].push(zan),qu.pop();
                        break;
                    }
                    else if((int)he.size()<m)//放入盒子
                        he.push(zan),qu.pop();
                    else//盒子满了
                    {
                        cnt++;
                        break;
                    }

                }
            }
            else//比这个值小的化就直接用盒子里的松针
            {
                he.pop();
                qus[cnt].push(zan);
            }
        }
        else
        {
            while(!qu.empty())//盒子里面是空的,其实就相当于盒子的值我们不能取,所以把上面关于这一部分的代码直接粘下来就行了
            {
                zan=qu.front();
                if(zan<=qus[cnt].back())//取到值了
                {
                    qus[cnt].push(zan),qu.pop();
                    break;
                }
                else if((int)he.size()<m)//放入盒子
                    he.push(zan),qu.pop();
                else//盒子满了
                {
                    cnt++;
                    break;
                }
            }
        }
    }
    for(int i=0; i<cnt; i++)
    {
        qus[i].pop();
        cout<<qus[i].front();
        qus[i].pop();
        while(!qus[i].empty())
        {
            cout<<" "<<qus[i].front();
            qus[i].pop();
        }
        cout<<endl;
    }
    return 0;
}
/*
8 3 4
20 25 15 18 20 18 8 5
*/
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值