在C++中寻找买家可以购买的最大数量的程序
假设我们有两个列表销售和购买者。销售中的每个元素都包含两个格式为[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