Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ห้องประชุม II ใน C++


สมมติว่ามีอาร์เรย์ของช่วงเวลาการประชุม มีเวลาเริ่มต้นและสิ้นสุดสองครั้ง[[s1,e1],[s2,e2],...] สองครั้งและแต่ละคู่เป็นไปตามกฎ (si

ดังนั้น หากอินพุตเป็น [[0, 30], [5, 10], [15, 20]] เอาต์พุตจะเป็น 2

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดลำดับความสำคัญ pq หนึ่งคิว

  • จัดเรียงอาร์เรย์ช่วงเวลา

  • ยกเลิก :=0

  • สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาดของช่วงเวลา ให้อัปเดต (เพิ่ม i ขึ้น 1) ทำ -

    • ในขณะที่ (ไม่ใช่ pq ว่างเปล่าและองค์ประกอบด้านบนของ pq <=ช่วงเวลา[i, 0]) ทำ -

      • ลบองค์ประกอบออกจาก pq

    • แทรกช่วงเวลา[i] ลงใน pq

    • ret :=สูงสุดของ ret และขนาดของ pq

  • รีเทิร์น

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

#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));
}

อินพุต

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

ผลลัพธ์

2