楼主:
oin1104 (是oin的说)
2024-10-11 15:09:53题目:
给你times阵列
里面有一堆idx当编号的边版人
还有到达跟离开的时间
在无限多张文盲号码中
每个到达的人
都会先跟爱蜜莉雅领取前面编号的号码牌
等到他们受不了之后
他们会把号码牌归还给爱蜜莉雅
idx编号是第target个的人是ZIDENS
请问ZIDENS是第几号文盲
思路:
先到先跑的题目都用queue
由于要用time来比较 而且要看他们的idx
所以用pq<pii>赛他们的资讯
直接模拟
放一堆号码牌
让一堆人排队
每个排队的人都看看过来在他之前会离开的人
让他们离开 并且把号码牌拿回来
然后再让这个人拿号码牌
顺便看他是不是立丹
```cpp
class Solution {
public:
int smallestChair(vector<vector<int>>& times, int targetFriend)
{
int n = times.size();
priority_queue<int , vector<int> , greater<int>> chairs;
for (int i = 0; i <= n; i++) chairs.push(i);
//arr idx
priority_queue<pair<int,int> , vector<pair<int,int>> , greater<pair<int,
int>>> arrive_f;
//leave chair
priority_queue<pair<int,int> , vector<pair<int,int>> , greater<pair<int,
int>>> leave_f;
for(int i = 0 ; i < n ; i ++)
{
arrive_f.push({times[i][0] , i});
}
while(!arrive_f.empty())
{
pair<int,int> nowf = arrive_f.top();
arrive_f.pop();
while(!leave_f.empty() && leave_f.top().first <= nowf.first)
{
pair<int,int> leavef = leave_f.top();
leave_f.pop();
chairs.push(leavef.second);
}
int chair = chairs.top();
chairs.pop();
if(nowf.second == targetFriend)return chair;
leave_f.push({times[nowf.second][1] , chair});
}
return -1;
}
};
```