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

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

7个月前 (08-02)

牛客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)。

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

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



原创内容 转载请注明出处

分享给朋友:

相关文章

力扣1221:一次扫描解决分割平衡字符串 时间O(n)空间O(1)

力扣1221:一次扫描解决分割平衡字符串 时间O(n)空间O(1)

题目重解给定一个仅包含'L'和'R'的字符串,要求将其分割成尽可能多的子串,且每个子串中'L'和'R'的数量相等。例如输入"R...

力扣933题:队列的妙用:如何高效统计最近请求

力扣933题:队列的妙用:如何高效统计最近请求

题目重解:我们需要设计一个能统计最近3000毫秒内请求次数的系统。每当新的请求到来时,它会带有时间戳t,我们需要返回过去3000毫秒内(包括当前)发生的请求总数。这就像是在时间轴上维护一个滑动窗口,只...

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

题目重解:数字三角形是一个经典的动态规划问题,给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们需要找到一条路径,使得路径上经过的数字总和最大。这个问题可以很...

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

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

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

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

一、题目解读力扣3112题要求解决带时间限制的最短路径问题:给定一个有向图,节点具有消失时间,需计算从起点到各节点的最短路径,且路径总时间不能超过节点的消失时间。题目难点在于需在传统最短路径算法(如D...

【牛客13256题解析】贪心算法优化题目组合问题:三元组与二元组的解题思路

【牛客13256题解析】贪心算法优化题目组合问题:三元组与二元组的解题思路

一、题目解读牛客13256题要求处理一组题目难度数据,通过组合三元组(难度差≤20)或二元组(难度差≤10)来重新编排题目,计算需要补充的最小题目数量。题目本质是资源分配与优化问题,需高效组合现有题目...

发表评论

访客

看不清,换一张

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