어흥

[백준 11000] 강의실 배정 (C++) 본문

알고리즘/백준

[백준 11000] 강의실 배정 (C++)

라이언납시오 2021. 3. 26. 19:39
728x90
반응형

문제 링크: www.acmicpc.net/problem/11000

 

11000번: 강의실 배정

첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000) 이후 N개의 줄에 Si, Ti가 주어진다. (1 ≤ Si < Ti ≤ 109)

www.acmicpc.net

1. 주의할 점

- 모든 강의에 대한 정보와, 현재 진행중인 강의를 어떻게 정렬할 것인지 잘 계획한다

 

2. 구현

- 모든 강의를 우선순위 PQ에 담는다. PQ의 경우, 시작시간이 빠른순으로 정렬하며, 시작시간이 같은 경우 종료 시간이 빠른 순으로 정렬한다. 종료시간을 1순위로 할 경우, 아래 TC에서 오답을 받게된다

TC #1
6
1 9
2 11
3 11
4 11
12 15
9 17

Answer: 4

- 현재 강의중인 강의실을 PQ2로 설정하고, 끝나는 시간을 기준으로 오름차순 정렬한다

- PQ의 모든 강의에 대해 탐색을 시작하며, 현재 진행하는 강의가 끝나는 시간보다 새로운 강의가 더 늦게 시작한다면 해당 강의실에서 수업하여 강의실을 추가할 필요 없으므로 PQ2에서 1개를 뽑는다. 이후, 새로운 강의가 끝나는 시간을 PQ2에 추가한다

- 이외의 경우에는 바로 PQ2에 새로운 강의의 끝나는 시간을 추가한다

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
struct info{
    int s,e;
};
struct cmp{
    bool operator()(info &a, info &b){
        if(a.s==b.s){
            return a.e > b.e;
        }
        return a.s > b.s;
    }
};
info tmp;
int main(){
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    priority_queue<info,vector<info>,cmp> pq;        //전체
    priority_queue<int,vector<int>,greater<int>> pq2;       //현재 강의중인 강의실
    int num,e,s,result=1;
    cin>>num;
    for(int i=0;i<num;i++){
        cin>>s>>e;
        tmp.s=s;
        tmp.e=e;
        pq.push(tmp);
    }
    while(!pq.empty()){
        int cs = pq.top().s;
        int ce = pq.top().e;
        pq.pop();
        if(!pq2.empty()){
            int r = pq2.top();
            if(r<=cs) pq2.pop();
        }
        pq2.push(ce);
        int vv = pq2.size();
        result=max(result,vv);
    }
    cout<<result;
    return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 1013] Contact (C++, Java)  (0) 2021.03.30
[백준 13144] List of Unique Numbers (C++)  (0) 2021.03.26
[백준 2982] 국왕의 방문 (C++)  (0) 2021.03.26
[백준 13907] 세금 (C++)  (2) 2021.03.19
[백준 13424] 비밀 모임 (C++)  (0) 2021.03.19
Comments