標籤:acm 掃描
題目連結
- 題意:
n組人,每組一行輸入:人數,到達時間,離開時間。問人數最多是多少(如果同一時刻有人到有人離開,那麼先讓人離開)
- 分析:
把一組人拆成兩個點,左端點和右端點,從左向右掃描。如果遇到一個左端點,加入集合中;如果遇到一個右端點,就把集合中對應的點刪去即可。
const int MAXN = 110000;struct Node{ int num, isr, id, time; bool operator< (const Node& rhs) const { if (time != rhs.time) return time < rhs.time; return isr > rhs.isr; }} ipt[MAXN];int main(){ int T, a, b, c, d, n, num; RI(T); FE(kase, 1, T) { RI(n); REP(i, n) { scanf("%d %d:%d %d:%d", &num, &a, &b, &c, &d); int x = i << 1, y = x | 1; ipt[x].isr = 0; ipt[x].time = a * 60 + b; ipt[y].isr = 1; ipt[y].time = c * 60 + d; ipt[x].id = ipt[y].id = i; ipt[x].num = ipt[y].num = num; } n <<= 1; sort(ipt, ipt + n); set<int> st; int ans = 0, tans = 0; REP(i, n) { if (ipt[i].isr) { st.erase(ipt[i].id); tans -= ipt[i].num; } else { st.insert(ipt[i].id); tans += ipt[i].num; } ans = max(ans, tans); } WI(ans); } return 0;}