本文主要是介绍PTA—包装机(队列),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
天梯赛训练里的一道L2题,自己一遍写出来了,用的双端队列(好像普通队列就可),但发现队列操作有些生疏了,今天就浅浅地复盘一下吧。
点赞别忘了亲👍👍👍👍
正文
- 题目链接
PTA | 程序设计类实验辅助教学平台
-
题面
一种自动包装机的结构如图 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.操作前要判断队空。
这篇关于PTA—包装机(队列)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!