在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
猜你喜欢