題意#
題目給定某餐廳接待了 \( n \) 位客人。
已知每位客人的「抵達時間」與「離開時間」。
我們需要求出營業過程中,餐廳「同一時間最多」有多少位客人?
思路#
本題為處理時間區間重疊的經典問題。
為了尋找「同時在場」的最多人數,首先將客人的「抵達時間」從小到大排序。
在實作上,需隨時掌握「在場客人中最早的離開時間」。
可以使用 Min-Heap(pq)來儲存已進入餐廳客人的「離開時間」,確保最早離開的時間位於頂端。
當處理新客人的抵達時間時:
若 pq 頂端的時間「早於」新客人的抵達時間,代表該客人已離開餐廳,將其從 pq 彈出。
持續清理已離開的客人後,將新客人的離開時間加入 pq。
此時 pq 的大小即為「當前」留在餐廳內的總人數。
在每次新客人進場時更新歷史最高人數,遍歷後即可得到答案。
程式碼#
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
#define INF LONG_LONG_MAX/1000
#define WA() cin.tie(0)->sync_with_stdio(0)
#define all(x) (x).begin(), (x).end()
#define int long long
#define PII pair<int, int>
signed main() { WA();
int n; cin >> n;
// 儲存每位客人的 {抵達時間, 離開時間}
vector<PII> v(n);
for (auto &i : v) cin >> i.fi >> i.se;
// 按照客人的「抵達時間」從小到大排序
sort(all(v));
// pq 用來儲存目前在餐廳內所有客人的「離開時間」,最早離開的會在最上面
priority_queue<int, vector<int>, greater<int>> pq;
int mx = -1e9;
for (auto &[sta, ed] : v) {
// 將抵達時間前已離開的客人移出餐廳
while (pq.size() && pq.top() < sta) pq.pop();
// 將新客人的離開時間加入 pq(代表他進入餐廳了)
pq.push(ed);
// pq 的大小為當下的在場總人數,更新最大值
mx = max(mx, (int)pq.size());
}
// 輸出最大同時在場人數
cout << mx << '\n';
}
