题目分析
这道题模拟了一个自动包装机的工作流程。包装机有N条轨道,每条轨道上有M个物品。筐的容量为S_max。我们需要根据输入的按钮操作序列,模拟物品从轨道到筐再到流水线的转移过程。
解题思路
-
数据结构选择:
-
用二维数组
SS
存储每条轨道上的物品 -
用一维数组
G
模拟筐(栈结构) -
用数组
C
记录各轨道的当前物品位置和筐的当前容量
-
-
操作处理:
-
当按下轨道按钮时:
-
如果筐已满,先执行0号操作(取出一个物品)
-
然后将该轨道当前物品推入筐
-
-
当按下0号按钮时:
-
从筐顶取出一个物品放到流水线
-
-
-
边界条件:
-
轨道为空时不处理
-
筐为空时不处理0号操作
-
筐满时强制先执行0号操作
#include<bits/stdc++.h> using namespace std; char SS[105][1005]; // 存储各轨道物品 char G[105]; // 筐(栈) int C[105]; // C[0]记录筐顶位置,C[1..N]记录各轨道当前位置 int main() { int n, m, s; cin >> n >> m >> s; // 读取各轨道初始物品 for(int i = 1; i <= n; i++) { scanf("%s", SS[i]); } // 初始化各轨道当前位置 for(int i = 1; i <= n; i++) { C[i] = 0; // 指向每个轨道的第一个物品 } C[0] = -1; // 筐初始为空 int op; while(cin >> op && op != -1) { if(op == 0) { // 0号操作:从筐中取出 if(C[0] >= 0) { // 筐不为空 cout << G[C[0]--]; // 输出筐顶物品 } } else { // 轨道操作 // 检查轨道是否为空 if(C[op] >= m) continue; // 检查筐是否已满 if(C[0] == s - 1) { // 筐满,强制先执行0号操作 if(C[0] >= 0) { cout << G[C[0]--]; } } // 将物品推入筐 if(C[0] < s - 1) { G[++C[0]] = SS[op][C[op]++]; } } } return 0; }
代码解释
-
输入处理:
-
读取轨道数n、每条轨道物品数m、筐容量s
-
读取各轨道物品到二维数组SS中
-
-
初始化:
-
C数组初始化:C[0]表示筐顶位置(初始-1表示空),C[1..n]表示各轨道当前要处理的物品位置
-
-
操作处理循环:
-
0号操作:筐不为空时,取出筐顶物品输出
-
轨道操作:
-
检查轨道是否为空
-
筐满时强制先执行0号操作
-
将当前轨道物品推入筐
-
-
-
输出:
-
每次执行0号操作时直接输出筐顶物品
-
-
注意事项
-
数组大小要足够(题目给出N≤100,M≤1000)
-
复杂度分析
-
时间复杂度:O(K),K为操作序列长度
-
空间复杂度:O(N*M + S),存储轨道物品和筐
-
这个解法直接模拟了包装机的工作流程,思路清晰,能够正确处理各种边界情况。
-
注意筐满时的强制操作处理
-
边界条件要处理周全(轨道空、筐空等情况)
-