假设我们有两个列表销售和购买者。销售中的每个元素都包含两个格式为[day,price]的值,这表示该包装仅在该天可以给定价格出售。买方中的每个元素都以[发薪日,金额]的形式表示,买方在发薪日及以后有该笔钱。如果每个购买者最多只能购买一个包裹,并且每个包裹只能卖给一个人,请找到可以购买的最大包裹数。
因此,如果输入就像销售= [[0,5],[0,5],[0,6],[1,4],[1,5],[3,4]]买家= [[ 0,4],[0,6],[1,5]],那么输出将为3,因为第一人称可以打包[1,4]。第二人称可以取[0,6]。最后一个人可以拿包裹[1,5]。
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: static bool cmp(vector<int>& a, vector<int>& b) { return a[0] == b[0] ? a[1] > b[1] : a[0] < b[0]; } int solve(vector<vector<int>>& sales, vector<vector<int>>& buyers) { int ret = 0; sort(buyers.begin(), buyers.end()); multiset<int> pq; sort(sales.begin(), sales.end(), cmp); int i = 0; for (auto& it : sales) { while (i < buyers.size() && buyers[i][0] <= it[0]) { pq.insert(buyers[i][1]); i++; } auto j = pq.lower_bound(it[1]); if (j != pq.end()) { ret++; pq.erase(j); } } return ret; } }; int solve(vector<vector<int>>& sales, vector<vector<int>>& buyers) { return (new Solution())->solve(sales, buyers); } int main(){ vector<vector<int>> sales = {{0, 5},{0, 5},{0, 6},{1, 4},{1, 5},{3, 4}}; vector<vector<int>> buyers = {{0, 4},{0, 6},{1, 5}}; cout << solve(sales, buyers); }
{{0, 5},{0, 5},{0, 6},{1, 4},{1, 5},{3, 4}}, {{0, 4},{0, 6},{1, 5}}
输出结果
3