餐桌问题
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;//最大获利数
以上是关于餐桌问题的主要内容,如果未能解决你的问题,请参考以下文章