boj 11000번. 강의실 배정.
2022. 12. 29. 18:25ㆍboj
https://www.acmicpc.net/problem/11000
11000번: 강의실 배정
첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000) 이후 N개의 줄에 Si, Ti가 주어진다. (0 ≤ Si < Ti ≤ 109)
www.acmicpc.net
문제는 최소힙을 통해 정렬된 값을 기준으로 하나씩집어넣다가
저장된 값보다 s가 크다면 팝하고 로테이트를 반복해주는 로직을 통해서
구현할 수 있다.
관련된 코드를 첨부하겠다.
class Heap {
public:
Heap() : len(0) {}
void add(int s, int e);
void pop();
int top();
void childSwap();
void parentSwap();
public :
vector<int> v;
int len;
};
void Heap::add(int s, int e) {
if (len >= 1 && this->top() <= s) {
this->childSwap();
}
v.push_back(e);
++len;
this->parentSwap();
}
int Heap::top() {
if (len == 0)
return (-1);
return (this->v[0]);
}
void Heap::pop() {
v.pop_back();
--len;
}
void Heap::parentSwap() {
int i;
int s = len - 1;
i = (s - 1) / 2;
for (; i >= 0; i = (i - 1) / 2) {
if (v[i] > v[s])
swap(v[i], v[s]);
if (i == 0)
break ;
s = i;
}
}
void Heap::childSwap() {
if (len < 1)
return ;
v[0] = v[len - 1];
this->pop();
int i, s;
s = 0;
for (i = 1; i < len;) {
if (i + 1 < len && v[i + 1] < v[i])
++i;
if (v[i] < v[s])
swap(v[i], v[s]);
else
break;
s = i;
i = i * 2 + 1;
}
}
'boj' 카테고리의 다른 글
15649 문제 해결. (0) | 2023.01.04 |
---|---|
1181cpp 문제 해결. (0) | 2022.12.30 |
냅색 문제 12865 배낭 (0) | 2022.12.29 |
별찍기-10 2447 (3) | 2022.12.26 |
1920 수찾기. (0) | 2022.12.25 |