L2-037 包装机 (分数25)(详解)

题目链接——L2-037 包装机

问题分析

这个题目就是模拟了物品在传送带和筐之间的传送过程。传送带用队列模拟,筐用栈模拟。

输入

3 4 4
GPLT
PATA
OMSA
3 2 3 0 1 2 0 2 2 0 -1

输出

根据上述操作,输出的物品顺序是:

MATA

样例分析

初始状态:
  • 筐(栈):空
  • 行1G P L T
  • 行2P A T A
  • 行3O M S A
操作步骤:
  1. 3(取行3的O入筐)→ 筐:[O]
  2. 2(取行2的P入筐)→ 筐:[O, P]
  3. 3(取行3的M入筐)→ 筐:[O, P, M]
  4. 0(输出筐顶M)→ 输出:M,筐:[O, P]
  5. 1(取行1的G入筐)→ 筐:[O, P, G]
  6. 2(取行2的A入筐)→ 筐:[O, P, G, A]
  7. 0(输出筐顶A)→ 输出:A,筐:[O, P, G]
  8. 2(取行2的T入筐)→ 筐:[O, P, G, T]
  9. 2(取行2的A,但筐已满)→ 先输出筐顶T,再入A
    → 输出:T,筐:[O, P, G, A]
  10. 0(输出筐顶A)→ 输出:A,筐:[O, P, G]
最终输出:
  • 按顺序输出的字符:M A T AMATA

解题思路

  1. 数据结构选择

    • 使用队列数组 queue<char> q[n + 1] 存储每行传送带上的物品。
    • 使用栈 stack<char> stk 模拟筐的存储。
  2. 输入处理

    • 输入 nmmx,分别表示传送带行数、每行物品数和筐的最大容量。
    • 读取每行传送带的物品,依次存入对应的队列。
  3. 指令处理

    • 循环读取指令 id
      • 如果 id == -1,结束程序。
      • 如果 id == 0,从筐顶取物并输出(若筐不为空)。
      • 如果 id > 0,从第 id 行传送带取物放入筐(若筐满则先取筐顶物品输出)。
  4. 关键点

    • 注意筐的容量限制,满时需先取再放。
    • 注意传送带队列和筐的空状态,避免非法操作。

具体见代码

#include<bits/stdc++.h>
#define debug(x) cout<<endl<<"===>"<<#x<<"="<<x<<endl;
#define output(x) cout<<x<<endl;
#define int long long
using namespace std;

void solve() {
    int n, m, mx;//n行,一行m个物品,筐的最大容量
    cin >> n >> m >> mx;
    stack<char> stk;//模拟筐的栈
    queue<char> q[n + 1];//每一行就是一个队列(下标从1开始)
    for(int i = 1; i <= n; i++) {
        string s;//一行的物品
        cin >> s;
        for(char c : s) q[i].push(c);
    }
    int id;
    while(cin >> id) {
        if(id == -1) break;//-1即退出
        if(id == 0) {//输出框顶部
            if(stk.empty()) continue;//注意筐空
            //输出筐顶,出栈
            cout << stk.top();
            stk.pop();
        } else {
            if(q[id].empty()) continue;//注意队列空
            //将队列的东西放入筐之前,检查是否满了
            if(stk.size() == mx) {//如果满了,就取筐顶
                cout << stk.top();
                stk.pop();
            }
            //放筐中,出队列
            stk.push(q[id].front());
            q[id].pop();
        }
    }
}

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    //while(1)//个人习惯,方便调试
    solve();
    return 0;
}
### L2-037 包装机 Java 实现方案 对于L2-037包装机问题,可以设计一个多线程处理程序来模拟物品打包过程。考虑到并发控制的重要性,可以借鉴`ConcurrentHashMap`中的锁分离机制[^1]以及同步方法的设计思路[^2]。 #### 设计思路 为了提高效率并确保数据一致性,采用生产者-消费者模式配合阻塞队列作为缓冲区。每个工作单元(如包装站)由独立线程负责执行特定任务,并通过共享资源协调彼此间的工作流程。 #### 主要组件 - **Item**: 表示待包装的商品类。 - **PackagingStationThread**: 负责实际包装工作的线程类。 - **BlockingQueue<Item> queue**: 存储未被包装商品的对象集合;当没有可用项目时会自动阻止尝试移除项目的操作直到有新条目加入。 #### 代码实现 ```java import java.util.concurrent.*; class Item { private final int id; public Item(int id) { this.id = id; } @Override public String toString() { return "Item{" + "id=" + id + '}'; } } class PackagingStationThread extends Thread { private BlockingQueue<Item> queue; public PackagingStationThread(BlockingQueue<Item> q, String name){ super(name); this.queue=q; } @Override public void run(){ while(true){ try{ // 获取下一个需要包装的item Item item=queue.take(); System.out.println(Thread.currentThread().getName()+" is packaging "+item); // 模拟包装时间 TimeUnit.MILLISECONDS.sleep((long)(Math.random()*100)); System.out.println(item+" has been packaged by "+Thread.currentThread().getName()); }catch(Exception e){ e.printStackTrace(); } } } } ``` 上述代码展示了如何创建一个简单的多线程环境来进行高效的任务分配与管理。利用了Java提供的高级特性如泛型、异常处理和并发工具包等技术手段实现了较为复杂的业务逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值