您的位置:首页 > 编程语言 > C语言/C++

【滴滴】餐馆

2017-09-04 12:51 344 查看
某餐馆有n张桌子,每张桌子有一个参数:a 可容纳的最大人数; 有m批客人,每批客人有两个参数:b人数,c预计消费金额。 在不允许拼桌的情况下,请实现一个算法选择其中一部分客人,使得总预计消费金额最大

//一开始用的暴力的方法,超时;后来参考别人的思路:用multimap存放桌子,先将客人按消费金额从大到小排序,同样金额

 

//的再按照人数从小到大进行排序,然后客人选择合适的桌子时用二分法(消费金额最多,人数最少的客人优先选择)

#include<iostream>
#include<vector>
#include<map>
#include<functional>
#include<algorithm>
using namespace std;
//按金额从大到小排序,相同消费金额的按人数从小到大排序
bool cmp(const pair<int, int> &left, const pair<int, int> &right) {
if (left.second == right.second)
return left.first<right.first;
else if (left.second<right.second)
return false;
else
return true;
}
int main() {
int n, m;
while (cin >> n >> m) {
multimap<int, int> table;
vector<pair<int, int> > guest(m);
for (int i = 0; i < n; i++) {
int tmp;
cin >> tmp;
table.insert(make_pair(tmp,1));
}
for (int i = 0; i < m; i++)
cin >> guest[i].first >> guest[i].second;
sort(guest.begin(), guest.end(), cmp);
long long  max_consum = 0;
int k = 0;
for (int i = 0; i<m; i++) {
auto itr = table.lower_bound(guest[i].first);
if (itr != table.end()) {
max_consum += guest[i].second;
table.erase(itr);
}
}
cout << max_consum << endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 滴滴