前言
天梯赛训练里的一道L2题,自己一遍写出来了,用的双端队列(好像普通队列就可),但发现队列操作有些生疏了,今天就浅浅地复盘一下吧。
点赞别忘了亲👍👍👍👍
正文
- 题目链接
-
题面
一种自动包装机的结构如图 1 所示。首先机器中有 N 条轨道,放置了一些物品。轨道下面有一个筐。当某条轨道的按钮被按下时,活塞向左推动,将轨道尽头的一件物品推落筐中。当 0 号按钮被按下时,机械手将抓取筐顶部的一件物品,放到流水线上。图 2 显示了顺序按下按钮 3、2、3、0、1、2、0 后包装机的状态。
一种特殊情况是,因为筐的容量是有限的,当筐已经满了,但仍然有某条轨道的按钮被按下时,系统应强制启动 0 号键,先从筐里抓出一件物品,再将对应轨道的物品推落。此外,如果轨道已经空了,再按对应的按钮不会发生任何事;同样的,如果筐是空的,按 0 号按钮也不会发生任何事。现给定一系列按钮操作,请你依次列出流水线上的物品。
-
思路
模拟即可:
队列模拟筐、轨道 ,数组存储放到传送带上的货物;队尾元素出队即为从筐中取货,队尾入队即为向筐中存货;队尾依次读入初始货物到轨道,队头出队即为货物离开传送带;然后模拟整个过程即可。
-
代码
#include<bits/stdc++.h>
using namespace std;
char s[10000][10000];
char ans[10000]; //传送带
deque<char>p[10000]; //轨道
deque<char> t; //筐
int main()
{ int n,m,i,k,a,b,c=0,pp=1,max1,j;
cin>>n>>m>>max1;
for(i=1;i<=n;i++)
{ cin>>s[i];
for( j=0; j<=strlen(s[i])-1; j++ )
p[i].push_back( s[i][j] ); //尾插
}
while(c!=-1)
{ cin>>c;
if(c==0)
{ if(t.empty()==0) //判断筐是否为空
{ ans[pp]=t.back();//取队尾元素放入传送带
t.pop_back(); //队尾出队
pp++; //传送带元素加一
}
}
else
{ if(p[c].empty()==0) //轨不空
{ if( t.size()<max1) //筐不满
{ t.push_back(p[c].front());//轨道队首元素尾插入筐
p[c].pop_front();//轨道队首元素出队
}
else //筐满
{ ans[pp]=t.back();//筐队尾元素放入传送带
t.pop_back();//筐队尾元素出队
pp++; //传送带元素加一
t.push_back(p[c].front());//轨道队首元素尾插入筐
p[c].pop_front();//轨道队首元素出队
}
}
}
}
for(i=1;i<=pp;i++)
cout<<ans[i];
}
-
思考
1.队列能很好的模拟有进有出的实际问题。
2.要搞清队尾队首对应实际问题的哪一部分。
3.操作前要判断队空。