🏦 银行叫号模拟 - 算法可视化教学

📋 题目描述

银行有 n 个客户按顺序到达,每人需要不同的服务时间。银行只有一个服务员,从 0 时刻开始连续为客户服务。请计算并输出每位客户结束服务的时刻。

📥 输入输出格式

输入格式
第一行:一个整数 n(1 ≤ n ≤ 100),表示客户数量
第二行:n 个整数,表示每位客户需要的服务时间 ti(1 ≤ ti ≤ 60)
输出格式
输出 n 行,每行一个整数
第 i 行表示第 i 位客户结束服务的时刻

📊 输入输出样例

样例 1
输入:
3
5 3 8

输出:
5
8
16
样例 2
输入:
4
10 5 3 7

输出:
10
15
18
25

💡 核心思想

问题分析
这是一道典型的模拟类题目。核心是模拟真实的银行服务过程:
  • 只有一个服务员,客户按顺序排队
  • 上一位客户结束 = 下一位客户开始
  • 用一个变量跟踪当前时间即可

⌨️ 参考代码

// 初始化当前时间为 0
int currentTime = 0;

// 遍历每位客户
for (int i = 0; i < n; i++) {
    currentTime += times[i]; // 累加服务时间
    cout << currentTime << endl; // 输出结束时刻
}

🔍 算法特点

✅ 空间优化
不需要用数组存储所有结果,可以边计算边输出,空间复杂度从 O(n) 降为 O(1)。
当前步骤
0
当前时间
0
已完成
0
剩余客户
0
当前时间
0
👨‍💼
服务员
💡 当前步骤说明
点击"单步执行"开始,观察每位客户的服务过程...
📋 服务记录
客户 服务时间 结束时刻
暂无记录

🎯 算法总结

O(n)
时间复杂度
O(1)
空间复杂度
📝 解题步骤
  1. 输入读取:读取客户数量 n 和服务时间数组
  2. 初始化变量:设置当前时间 currentTime = 0
  3. 遍历客户:依次处理每位客户
  4. 累加时间:currentTime += 当前客户服务时间
  5. 输出结果:输出 currentTime 作为结束时刻
⚠️ 常见错误
错误1:忘记初始化
忘记将 currentTime 初始化为 0,导致结果随机错误
错误2:顺序颠倒
先输出再累加时间,应该先累加再输出
错误3:空间浪费
用数组存储所有结果再输出,其实可以边算边输出

🔬 考点分析

📌 核心考点
  • 模拟思想:按照题目描述的过程模拟执行
  • 变量跟踪:用单个变量记录状态变化
  • 空间优化:边计算边输出,节省存储空间
  • 一次遍历:线性时间复杂度,效率最高

🚀 扩展思考

💭 如果有多个服务员?
  • 需要记录每个服务员的空闲时间
  • 每次选择最早空闲的服务员
  • 可以用优先队列优化选择过程
💭 如果客户不是同时到达?
  • 需要考虑客户到达时间
  • 服务员可能需要等待客户到达
  • 如果当前时间 < 客户到达时间,直接跳到到达时间
💭 如果允许 VIP 插队?
  • 需要维护多个队列
  • VIP 客户优先级更高
  • 考虑公平性,防止普通客户饿死

📚 同类题目推荐

  • 约瑟夫环 - 经典模拟问题
  • 模拟计算器 - 按步骤模拟运算
  • 数组连续性判断 - 状态跟踪
  • 任务调度 - 多服务员问题扩展