餐桌问题

题目:有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;//最大获利数
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值