使用 C++ 计算餐厅最少所需桌子数以满足所有顾客用餐
以下是解决该问题的 C++ 代码: ```cpp #include <iostream> #include <vector> #include <algorithm> // 定义顾客结构体,包含到达时间、最大等待时间和离开时间 struct Customer { int arrivalTime; int waitTime; int leaveTime; }; // 比较函数,按照顾客的到达时间进行排序 bool compareByArrival(const Customer& a, const Customer& b) { return a.arrivalTime < b.arrivalTime; } // 计算最少需要的桌子数 int minTablesRequired(const std::vector<Customer>& customers, int m) { int n = customers.size(); std::vector<int> tableEndTimes; // 存储每张桌子的结束使用时间 for (const auto& customer : customers) { int availableTable = -1; // 遍历所有桌子,找到最早结束使用且能满足当前顾客等待时间的桌子 for (int i = 0; i < tableEndTimes.size(); ++i) { if (tableEndTimes[i] <= customer.arrivalTime) { availableTable = i; break; } } if (availableTable != -1) { // 如果找到可用桌子,更新该桌子的结束使用时间 tableEndTimes[availableTable] = customer.arrivalTime + m; } else { // 如果没有可用桌子,添加一张新桌子 tableEndTimes.push_back(customer.arrivalTime + m); } } return tableEndTimes.size(); } int main() { int n, m; std::cout << "请输入顾客的数量 n 和用餐时间 m: "; std::cin >> n >> m; std::vector<Customer> customers(n); for (int i = 0; i < n; ++i) { std::cout << "请输入第 " << i + 1 << " 名顾客的到达时间和最大等待时间: "; std::cin >> customers[i].arrivalTime >> customers[i].waitTime; customers[i].leaveTime = customers[i].arrivalTime + customers[i].waitTime; } // 按照顾客的到达时间进行排序 std::sort(customers.begin(), customers.end(), compareByArrival); int result = minTablesRequired(customers, m); std::cout << "餐厅至少需要安排 " << result << " 张桌子才能让所有顾客都吃上饭。" << std::endl; return 0; } ``` ### 代码解释: 1. **结构体 `Customer`**:用于存储每个顾客的到达时间、最大等待时间和离开时间。 2. **比较函数 `compareByArrival`**:用于对顾客按照到达时间进行排序。 3. **函数 `minTablesRequired`**:计算最少需要的桌子数。遍历每个顾客,尝试找到最早结束使用且能满足当前顾客等待时间的桌子。如果找到,则更新该桌子的结束使用时间;否则,添加一张新桌子。 4. **主函数 `main`**:读取输入的顾客数量、用餐时间和每个顾客的到达时间和最大等待时间,调用 `minTablesRequired` 函数计算最少需要的桌子数,并输出结果。 ### 复杂度分析: - **时间复杂度**:排序的时间复杂度为 $O(n log n)$,遍历每个顾客的时间复杂度为 $O(n)$,因此总的时间复杂度为 $O(n log n)$。 - **空间复杂度**:主要用于存储每张桌子的结束使用时间,空间复杂度为 $O(n)$。 ######[AI问答 | 841点数解答 | 2026-05-05 10:09:23]
- JSP 实现商品展示模块:分页、搜索、交互与美观界面全搞定!(字节豆包 | 19点数解答 | 2024-12-13 15:00:43)375
- C++ 实现:根据给定正整数构造 3×3 方阵并计算满足条件的方案数(阿里通义 | 875点数解答 | 2024-11-13 16:38:24)272
- C++实现:低复杂度求解 3×3 方阵构造方案数(阿里通义 | 708点数解答 | 2024-11-13 16:45:15)308
- Python 高效解决 U 王国社区端午节粽子分配数量计算问题(DeepSeek | 218点数解答 | 2025-05-31 18:33:52)218
- C++ 实现:根据家庭人数精准计算 U 王国社区粽子分配总数(DeepSeek | 250点数解答 | 2025-05-31 18:36:11)189
- 幼儿园小朋友学号奇偶分类:代码实现与详细解释(字节豆包 | 406点数解答 | 2025-11-26 19:39:05)83
- 策略游戏大揭秘:小 L 与小 Q 最优策略下每轮得分计算全解析(字节豆包 | 676点数解答 | 2025-12-12 18:49:42)80
- Python代码:简化网友国度货币系统,求解最小货币种数(字节豆包 | 529点数解答 | 2025-12-13 10:29:25)69
- 数轴旅行:从原点出发,能否到达目标位置?(字节豆包 | 225点数解答 | 2026-01-23 19:51:03)72
- Python 实现:计算特殊规则矩阵行列式并对 109+7 取模(字节豆包 | 672点数解答 | 2026-02-05 20:46:07)92
- 银行服务同步:用信号量实现顾客与营业员的高效交互(阿里通义 | 539点数解答 | 2024-12-13 14:41:41)378
- 银行服务系统:用信号量实现顾客与营业员操作的互斥和同步(阿里通义 | 731点数解答 | 2024-12-13 14:42:20)221