力扣2402.会议室 III
-
双堆模拟
- 一个堆存未占用的会议室编号
- 一个堆存已占用的结束时间和编号
cpp
class Solution {
public:
int mostBooked(int n, vector<vector<int>>& meetings) {
int cnt[n];
memset(cnt,0,sizeof(cnt));
priority_queue<int,vector<int>,greater<>> idle;
for(int i=0;i<n;i++) idle.push(i);
priority_queue<pair<long,int>,vector<pair<long,int>>,greater<>> using_;
//按照开始时间排序
sort(meetings.begin(),meetings.end(),[](auto &a,auto &b){
return a[0] <b[0];
});
for(auto &m:meetings)
{
long st = m[0],end = m[1],id;
//已经到了结束时间,弹出去
while(!using_.empty() && using_.top().first <= st)
{
idle.push(using_.top().second);
using_.pop();
}
//没有空会议室了
if(idle.empty())
{
auto [e,i] = using_.top();
using_.pop();
//结束时间 + 等待时间
end += e - st;
id = i;
}
//有空会议室
else
{
id = idle.top();
idle.pop();
}
cnt[id] ++;
using_.emplace(end,id);
}
int ans = 0;
//取最大的cnt
for(int i=0;i<n;i++)
if(cnt[i] > cnt[ans])
ans = i;
return ans;
}
};