일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 그리디
- LazyPropagation
- lis
- 플로이드와샬
- dfs
- 위상정렬
- DP
- 크루스칼
- 백준
- 다익스트라
- 좌표압축
- 비트마스크
- 펜윅트리
- 수학
- 이분매칭
- 세그먼트트리
- BFS
- MST
- 브루트포스
- 이진탐색
- lca
- 투포인터
- 정렬
- DisjointSet
- 이분탐색
- boj
- 구현
- 에라토스테네스의 체
- 누적합
- 삼분탐색
Archives
- Today
- Total
lastknight00
[백준]강의실 배정(11000) 본문
문제 링크 : [백준]강의실 배정(11000)
문제 설명
N개의 강의가 주어지는데, 각 강의는 시작 시각과 종료 시각이 주어집니다.
같은 시각에 겹치는 강의는 한 강의실에서 진행 할 수 없습니다.
모든 강의를 진행하는데 필요한 최소 강의실 수를 구하세요.
입력
N(강의 갯수, 1 <= N <= 200,000)
Si Ei(강의 시작, 종료 시각, 1 <= Si, Ei <= 1,000,000,000)
3
1 3
2 4
3 5
출력
2
카테고리
#이분탐색 #정렬
시간 복잡도 상한
O(N * logN)
해결 방법
- 특정 강의보다 먼저 시작했으면서 그 강의가 시작할 때까지 종료되지 않은 강의의 갯수를 구하면, 그 강의가 시작할 때 최소 몇개의 강의실이 필요한지 구할 수 있습니다.
- 1을 구하기 위하여, 시작과 종료 시각을 하나의 구조체로 담아 정렬을 하면 됩니다.
- 라고 하기엔 하나로 관리를 하게되면, 특정 강의보다 먼저 시작했지만 나중에 끝나는 강의에 대한 갯수를 세는 것이 어려워집니다.
- 그래서 시작 시각과 종료 시각을 따로 관리합니다.
- 특정 강의의 시작 시각보다 먼저 종료된 강의는 항상 특정 강의보다 먼저 시작하였기 때문에 갯수를 세는데 문제가 없습니다.
- 각각을 따로 벡터에 담아 오름차순으로 정렬을 합니다.
- 특정 강의 시작시각보다 먼저 종료되는 강의의 갯수를 이분탐색으로 파악합니다.
- 특정 강의의 인덱스가 현재까지 열린 강의의 수가 됩니다.
- 현재까지 열린 강의의 수 - 종료된 강의의 수를 반복파악합니다.
- 그 중에서 가장 큰 수를 출력합니다.
시간복잡도
O(N * logN)
코드
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n,a,b,i;
vector<int>v,w;
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>n;
for(i=0;i<n;i++){
cin>>a>>b;
v.push_back(a);w.push_back(b);
}
sort(v.begin(),v.end());
sort(w.begin(),w.end());
for(a=i=0;i<n;i++){
b=upper_bound(w.begin(),w.end(),v[i])-w.begin();
a=max(a,i+1-b);
}
cout<<a;
}
'PS' 카테고리의 다른 글
[백준]지름길(1446) (0) | 2020.07.18 |
---|---|
[백준]주유소(13308) (0) | 2020.07.18 |
[백준]비밀 모임(13424) (0) | 2020.07.18 |
[백준]숫자구슬(2613) (0) | 2020.07.15 |
[백준]피자판매(2632) (0) | 2020.07.15 |
Comments