문제
https://www.acmicpc.net/problem/1655
걸린 시간
- 실패
풀이
C++
#include <bits/stdc++.h>
#define INF 1e9
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int n, x;
priority_queue<int> l, r;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
// 1번째
cin >> x;
l.push(x);
cout << l.top() << "\n";
// 2번째
cin >> x;
if(x >= l.top()){
r.push(-x);
}
else{
r.push(-l.top());
l.pop();
l.push(x);
}
cout << min(l.top(), -r.top()) << "\n";
// 3~n 번째
for(int i = 3; i <= n; i++){
cin >> x;
if(i%2 == 0){ // 짝수번째, 짝수개
if(x >= l.top()){
r.push(-x);
}
else{
r.push(-l.top());
l.pop();
l.push(x);
}
cout << min(l.top(), -r.top()) << "\n";
}
else{
if(x <= -r.top()){
l.push(x);
}
else{
l.push(-r.top());
r.pop();
r.push(-x);
}
cout << l.top() << "\n";
}
}
return 0;
}
이 문제는 두개의 힙을 사용하면 해결할 수 있다.
왼쪽이 최대힙 오른쪽이 최소힙 일 때 왼쪽부터 번갈아가며 숫자를 채워 나간다.
두 힙의 크기가 균형을 이루며 모든 값이 오름차순일 경우, 숫자의 총 개수가 홀수면 최대힙의 top, 짝수면 두 힙의 top 중 작은 값 이 중간값이 된다.
힙에 값이 올바르게 들어가려면 각 차례마다 반대편 힙의 top 원소와 외친 수를 비교하여 어느 힙에 숫자를 삽입해야 하는지 확인하는 과정이 필요하다.
'Baekjoon' 카테고리의 다른 글
Baekjoon 1039번 교환 (0) | 2020.11.19 |
---|---|
Baekjoon 4195번 친구 네트워크 (0) | 2020.11.16 |
Baekjoon 5213번 과외맨 (0) | 2020.11.12 |
Baekjoon 1010번 다리 놓기 (0) | 2020.11.12 |
Baekjoon 16235번 나무 재테크 (0) | 2020.11.12 |
댓글