朴素做法,分别排序桌子和客人,再逐个安排

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, m;
    vector<pair<long, long>> customers; // 人数--金额 数对
    vector<pair<long, bool>> desks; // 容量-是否占用 数对
    cin >> n >> m;
    long temp1, temp2;
    for (long i = 0; i < n; i++) {
        cin >> temp1;
        desks.emplace_back(temp1, false);
    }
    // 将桌子能容纳的人数按从小到小排序
    sort(desks.begin(), desks.end(), [&](const auto & a, const auto & b) {
        return a.first < b.first;
    });
    for (long i = 0; i < m; i++) {
        cin >> temp1 >> temp2;
        customers.emplace_back(temp1, temp2);
    }
    // 将客人消费金额按从大到小排序
    sort(customers.begin(), customers.end(), [&](const auto & a, const auto & b) {
        return a.second > b.second;
    });

    long ans = 0, used = 0; // 金额,已占用桌子数
    for (long i = 0; i < m; i++) {
        // 如果最大的桌子都坐不下这批人,跳过
        if (desks[n - 1].first < customers[i].first) {
            continue;
        }
        // 如果没有空余桌子了,跳出
        if (used == n) {
            break;
        }
        for (long j = 0; j < n; j++) {
            // 找到第一个容量足够且空余的桌子
            if (desks[j].first >= customers[i].first && desks[j].second == false) {
                desks[j].second = true; // 把桌子标记为已占用
                ans += customers[i].second;
                used++;
                break;
            }
        }
    }

    cout << ans << endl;
    return 0;
}

时间复杂度:

1、对桌子容量进行排序的时间复杂度为O(nlogn),其中n为桌子的数量

2、对客人消费金额进行排序的时间复杂度为O(mlogm),其中m为客人的数量

3、遍历每个客人并在桌子中查找可用桌子的时间复杂度为O(mn)

因此,总的时间复杂度为O((m+n)logn + mn)。

空间复杂度:使用了两个vector来存储桌子和客人的信息,所以空间复杂度为O(n+m),其中n为桌子的数量,m为客人的数量