Computer >> Máy Tính >  >> Lập trình >> C ++

Phòng họp II bằng C ++

Giả sử có một mảng các khoảng thời gian họp. Có hai thời điểm bắt đầu và thời gian kết thúc [[s1, e1], [s2, e2], ...] và mỗi cặp thỏa mãn quy tắc (si

Vì vậy, nếu đầu vào là [[0, 30], [5, 10], [15, 20]], thì đầu ra sẽ là 2.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • xác định một hàng đợi ưu tiên pq

  • sắp xếp mảng khoảng thời gian

  • ret:=0

  • để khởi tạo i:=0, khi i

    • while (không phải pq trống và phần tử trên cùng của pq <=khoảng [i, 0]), do -

      • xóa phần tử khỏi pq

    • chèn khoảng [i] vào pq

    • ret:=tối đa của ret và kích thước của pq

  • trả lại ret

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#include <bits/stdc++.h>
using namespace std;
struct Comparator{
   bool operator()(vector <int<& a, vector <int<& b){
      return !(a[1] < b[1]);
   }
};
class Solution {
public:
   static bool cmp(vector <int< a, vector <int< b){
      return (a[1] < b[1]);
   }
   int minMeetingRooms(vector<vector<int<>& intervals) {
      priority_queue<vector<int<, vector<vector<int< >, Comparator> pq;
      sort(intervals.begin(), intervals.end());
      int ret = 0;
      for (int i = 0; i < intervals.size(); i++) {
         while (!pq.empty() && pq.top()[1] <= intervals[i][0])
         pq.pop();
         pq.push(intervals[i]);
         ret = max(ret, (int)pq.size());
      }
      return ret;
   }
};
main(){
   vector<vector<int<> v = {{0, 30}, {5, 10}, {15, 20}};
   Solution ob;
   cout << (ob.minMeetingRooms(v));
}

Đầu vào

{{0, 30}, {5, 10}, {15, 20}}

Đầu ra

2