餐桌问题

Posted 爱橙子的OK绷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了餐桌问题相关的知识,希望对你有一定的参考价值。

题目:有n张桌子,m批人,每张桌子容纳的最大人数为h,每批人的人数为a,预计消费为c,每张桌子坐的人数不能大于h,不能拼桌和分桌,同一张桌子只能容纳同一批人,求怎么样消费是餐馆获利最高。

#include <iostream>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
struct Person//每一批顾客
    int b;
    int c;
;
int cmp(Person x,Person y)
    if (x.c == y.c)
        return x.b < y.b;//再按人数升序
    return x.c > y.c; //先按金额降序


int main()
    int n,m;
    long long ans=0;
    vector<Person> v;//存的每一批顾客这个结构体!!!
    multiset<int> s;//存储每个桌子的容量!!!
    cin>>n>>m;//桌子数和批次
    for(int i = 0; i < n; i++)
        int x;
        cin>>x;//每个桌子的容量
        s.insert(x);
    
    for(int i = 0; i < m; i++)
        int x, y;//每一批的人数和金额
        cin>>x>>y;
        Person tmp;
        tmp.b = x, tmp.c = y;
        v.push_back(tmp);//将该结构体放到vector
    
    sort(v.begin(),v.end(),cmp);//把顾客按消费金额降序,人数升序排序
    for(int i = 0; i < m; i++)//对于已排好序的顾客,遍历匹配,优先处理金额大的
        //set::lower_bound(key):返回set中第一个大于或等于key的迭代器指针
        //v[i].b代表这一批顾客的人数,要找到一个桌子刚好容纳他
        multiset<int>::iterator it = s.lower_bound(v[i].b);//!!!!!
        if (it != s.end())
            s.erase(it);//如果该桌子上可以容纳这批顾客,则占用,即删除这个桌子
            ans += v[i].c;//可以容纳后,则加上该批顾客的金额
        
    
    cout<<ans<<endl;//最大获利数

以上是关于餐桌问题的主要内容,如果未能解决你的问题,请参考以下文章

P3254 圆桌问题

强制参与餐桌的最佳方式

从离开餐桌的天数计算每月的天数

滴滴笔试题 就餐问题

[cogs729]圆桌问题(最大流)

网络流24题圆桌聚餐