当前位置:首页 > 牛客 > 牛客12650题解析:基于贪心算法的桌子与客人匹配问题

牛客12650题解析:基于贪心算法的桌子与客人匹配问题

1天前

牛客12650题解析:基于贪心算法的桌子与客人匹配问题 牛客题解 贪心算法 C++ 第1张

一、题目解读

牛客12650题要求处理一个资源分配问题:给定n张不同容量的桌子与m个携带消费金额的客人,客人需匹配到可容纳人数的桌子,目标是最大化所有匹配客人的总消费金额。题目本质是约束条件下的优化问题,需平衡桌子容量与客人需求的匹配效率。

二、解题思路

1. 贪心策略核心:优先安排高消费金额的客人,确保“价值最大化”的匹配。

2. 数据结构选择:

    桌子容量存入multiset(支持自动排序与快速查找),便于动态删除已占用桌子。

    客人信息用vector存储,按消费金额降序排序,确保优先处理高价值客人。

3. 关键操作:通过lower_bound定位首个满足容量要求的桌子,实现O(logn)查找效率,避免暴力遍历。

三、解题步骤

1. 输入处理:

    读取桌子容量并存入multiset,自动升序排列。

    读取客人信息(人数与消费金额),存入vector后排序(金额降序)。

2. 匹配逻辑:

    遍历客人列表,对每个客人调用tables.lower_bound(人数)查找合适桌子。

    若找到桌子,累加消费金额并删除该桌子(避免重复使用)。

3. 输出结果:最终累计的消费总额即为最优解。

四、代码与注释

#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;

// 客人结构体(按消费金额降序排序)
struct Guest {
    int b; // 人数
    int c; // 消费金额
    bool operator<(const Guest& other) const {
        return c > other.c; // 自定义排序规则:金额降序
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr); // 加速输入

    int n, m; // 桌子数量、客人数量
    cin >> n >> m;

    // 桌子容量存入multiset(自动排序)
    multiset<int> tables;
    for (int i = 0; i < n; ++i) {
        int a;
        cin >> a;
        tables.insert(a);
    }

    // 客人信息读取与排序
    vector<Guest> guests(m);
    for (int i = 0; i < m; ++i) {
        cin >> guests[i].b >> guests[i].c;
    }
    sort(guests.begin(), guests.end()); // 按消费金额降序排列

    long long total = 0; // 累计消费金额
    for (const auto& guest : guests) {
        // 查找首个满足人数的桌子(O(logn))
        auto it = tables.lower_bound(guest.b);
        if (it!= tables.end()) {
            total += guest.c;
            tables.erase(it); // 删除已占用桌子
        }
    }

    cout << total << endl;
    return 0;
}

五、总结

本解法通过“贪心+数据结构优化”实现高效解题:

● 排序与lower_bound的结合避免了复杂匹配搜索,时间复杂度O(mlogn)。

● 动态删除占用桌子确保解的唯一性,符合题目约束。

● 代码结构清晰,注释明确,适用于算法面试与工程实践。



原创内容 转载请注明出处

分享给朋友:

相关文章

力扣965题深度解析:单值二叉树的判断技巧

力扣965题深度解析:单值二叉树的判断技巧

重新解读题目 判断一棵二叉树是否为“单值二叉树”,即所有节点的值是否完全相同。题目看似简单,实则考验对树结构递归特性的理解。若一棵树的所有节点值相同,其必然满足:根节点与左右子树的值一致,且...

牛客13271题「删除K个数字的最小数」解题报告:贪心算法与栈的应用(附代码注释)

牛客13271题「删除K个数字的最小数」解题报告:贪心算法与栈的应用(附代码注释)

一、题目解读牛客13271题要求从给定的数字字符串中删除K个数字,使得剩余数字按原顺序排列后得到的最小数。题目核心在于如何在保持数字相对顺序的前提下,通过删除操作得到最优解。需注意结果字符串可能包含前...

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

一、题目解读洛谷B3617题要求将输入的八进制字符串转换为十六进制表示。题目需处理大数场景,且对输入合法性有明确限制(长度不超过1000,仅包含0-7字符)。由于八进制与十六进制无法直接转换,需借助十...

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

一、题目解读洛谷1184题要求处理一组地点列表与行程记录,统计其中匹配的天数。题目难点在于高效处理带有空格的字符串输入,以及快速判断每日行程是否在高手可去地点集合中。需要兼顾输入格式解析与算法效率。二...

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

一、题目解读洛谷1220题要求计算在n个位置放置灯的情况下,通过关闭连续区间灯并移动至区间端点,使得总耗电量最小。需考虑灯的功率与位置差异,设计高效的算法求解最优策略。二、解题思路1. 动态规划 +...

牛客NC67题解:汉诺塔递归算法与解题步骤

牛客NC67题解:汉诺塔递归算法与解题步骤

一、题目解读牛客NC67题要求解决汉诺塔问题,这是一个经典的递归算法题目。题目给定整数n,代表汉诺塔中的盘子数量,需要输出将n个盘子从起始柱移动到目标柱的所有步骤。汉诺塔问题规则为:每次只能移动一个盘...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。