题目描述
某餐馆有n张桌子,每张桌子有一个参数:a 可容纳的最大人数; 有m批客人,每批客人有两个参数:b人数,c预计消费金额。 在不允许拼桌的情况下,请实现一个算法选择其中一部分客人,使得总预计消费金额最大
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
# define f(i,m,n) for(int i=m; i<=n; i++)
# define sf(x) scanf("%d", &x)
using namespace std;
typedef long long int ll;
struct cus {
int m, b;
};
struct cmp {
bool operator()(cus a, cus b) {
return a.m < b.m;
}
};
int _cmp(cus a, cus b) {
return a.b < b.b;
}
priority_queue<cus, vector<cus>, cmp> q;
int a[500010];
cus b[500010];
int main() {
int n, m;
sf(n);sf(m);
f(i, 1, n) sf(a[i]);
while (!q.empty())q.pop();
ll sum = 0;
f(i, 1, m) {
sf(b[i].b);sf(b[i].m);
}
sort(a + 1, a + 1 + n);
sort(b + 1, b + 1 + m, _cmp);
int j = 1;
f(i, 1, n) {
for (; j <= m; j++)
if (a[i] >= b[j].b) q.push(b[j]);
else break;
if (q.empty()) continue;
else {
sum = sum + q.top().m;
q.pop();
}
}
printf("%lld", sum);
return 0;
}