找回密码
 立即注册
查看: 35|回复: 0

牛客网4812题:从贪心到二分,餐馆安排**算法解析

[复制链接]
  • 打卡等级:常驻代表
  • 打卡总天数:33
  • 打卡月天数:2
  • 打卡总奖励:223
  • 最近打卡:2025-08-14 15:12:36

39

主题

1

回帖

4597

积分

VIP会员

积分
4597
发表于 2025-7-28 14:09:43 | 显示全部楼层 |阅读模式
牛客网4812题要解决餐馆经营问题,想象你是一家热门餐馆的经理,每天需要安排大量客人入座。如何在不拼桌的情况下,让餐馆获得**收益?
一、问题重述与分析
我们需要处理n张桌子(容量各不相同)和m批客人(人数和消费金额不同),目标是通过合理安排使总消费金额**化。关键约束:
  • 不允许拼桌
  • 每批客人必须全部安排在一张桌子
  • 桌子容量必须≥客人数

二、算法选择
贪心策略:优先安排单位人数消费高的客人 二分查找:快速找到合适桌子
详细步骤解析
  • 数据预处理

    • 桌子容量排序:使用multiset自动排序并允许重复
    • 客人排序:按消费金额降序排列

  • 核心算法流程

    • 遍历排序后的客人列表
    • 对每位客人,用lower_bound找到最小合适桌子
    • 如果找到,累加金额并移除该桌子

  • 复杂度分析

    • 排序:O(nlogn + mlogm)
    • 查找:O(mlogn)
    • 总体:O(nlogn + mlogm)

三、代码实现细节
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <set>
  5. using namespace std;

  6. struct Guest {
  7.     int b; // 人数
  8.     int c; // 消费金额
  9.     bool operator<(const Guest& other) const {
  10.         return c > other.c; // 按金额降序排列
  11.     }
  12. };

  13. int main() {
  14.     ios::sync_with_stdio(false);
  15.     cin.tie(nullptr);

  16.     int n, m;
  17.     cin >> n >> m;

  18.     // 读取桌子容量并排序
  19.     multiset<int> tables;
  20.     for (int i = 0; i < n; ++i) {
  21.         int a;
  22.         cin >> a;
  23.         tables.insert(a);
  24.     }

  25.     // 读取客人信息并排序(按金额降序)
  26.     vector<Guest> guests(m);
  27.     for (int i = 0; i < m; ++i) {
  28.         cin >> guests[i].b >> guests[i].c;
  29.     }
  30.     sort(guests.begin(), guests.end());

  31.     long long total = 0;
  32.     for (const auto& guest : guests) {
  33.         // 找到最小的大于等于人数的桌子
  34.         auto it = tables.lower_bound(guest.b);
  35.         if (it != tables.end()) {
  36.             total += guest.c;
  37.             tables.erase(it); // 该桌子被占用
  38.         }
  39.     }

  40.     cout << total << endl;
  41.     return 0;
  42. }
复制代码


四、常见问题解答
Q:为什么不用动态规划? A:数据规模太大(5e4),DP复杂度不可接受
Q:如何处理相同消费金额的客人? A:任意顺序处理均可,不影响最终结果
五、扩展思考
  • 如果允许拼桌,算法如何修改?
  • 考虑翻台率因素后的优化方向
  • 实时预约系统的算法调整

来源:牛客题解

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表