目前只想到,基于数据结构维护的贪心。
思路:从高贵到低贱服务,相同的价格的?人数少的优先。
然后对每个人,找一张桌子,这张桌子是剩余桌子中刚刚好满足要求的。
——使用平衡树比较好,比如C++的multiset,这样每次是logn的
嗯,就这样。
#include <stdio.h>
#include <set>
#include <algorithm>
using namespace std;
int desk[50005];
struct Pep {
int num;
int price;
bool operator<(const Pep&b)const {
if (price != b.price)return price > b.price;
return num < b.num;
}
void get() {
scanf("%d%d", &num, &price);
}
}pep[50005];
int main() {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < n; ++i) {
scanf("%d", &desk[i]);
}
for (int i = 0; i < m; ++i) {
pep[i].get();
}
multiset<int> dsize;
for (int i = 0; i < n; ++i) {
dsize.insert(desk[i]);
}
sort(pep, pep + m);
long long ans = 0;
for (int i = 0; i < m; ++i) {
multiset<int>::iterator it = dsize.lower_bound(pep[i].num);
if (it == dsize.end())continue;
while (it != dsize.begin() && *it > pep[i].num) --it;
while (it != dsize.end() && *it < pep[i].num) ++it;
if (it == dsize.end()) --it;
if (it != dsize.end()) {
ans += pep[i].price;
dsize.erase(it);
}
}
printf("%lld\n", ans);
return 0;
}