Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 구매자가 구매할 수 있는 최대 패키지 수를 찾는 프로그램

<시간/>

두 개의 목록 판매 및 구매자가 있다고 가정합니다. 판매의 각 요소에는 [일, 가격] 형식의 두 값이 포함되어 있으며 이는 패키지가 해당 날짜에만 해당 가격에 판매 가능함을 나타냅니다. 그리고 [payday, amount] 형식의 구매자의 각 요소는 구매자가 월급날 이후에 지출할 금액이 있음을 나타냅니다. 각 구매자가 최대 하나의 패키지를 구입할 수 있고 각 패키지를 한 사람에게만 판매할 수 있는 경우 구입할 수 있는 최대 패키지 수를 찾으십시오.

따라서 입력이 판매 =[[0, 5], [0, 5], [0, 6], [1, 4], [1, 5], [3, 4]]와 같은 경우 구매자 =[[ 0, 4], [0, 6], [1, 5]], 첫 번째 사람이 패키지 [1, 4]를 사용할 수 있으므로 출력은 3이 됩니다. 두 번째 사람은 [0, 6]을 취할 수 있습니다. 그리고 마지막 사람이 패키지[1, 5]를 가져갈 수 있습니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 렛 :=0

  • 급여일이 동일한 경우 급여일을 기준으로 배열 구매자를 정렬합니다.

  • 세트 pq 정의

  • 배열 판매 정렬

  • 나는 :=0

  • 판매에 있는 각 품목에 대해 −

    • 동안 (i <구매자와 구매자의 크기[i, 0] <=it[0]), do -

      • pq에 구매자[i, 1] 삽입

      • (i를 1씩 증가)

    • j :=삽입할 pq의 인덱스[i] intp pq 및 정렬

    • j가 유효한 인덱스이면 -

      • (ret 1 증가)

      • pq에서 j번째 요소 삭제

  • 리턴 렛

예시

더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −

#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