BOJ 백준 1655 C++
가운데를 말해요
https://www.acmicpc.net/problem/1655
0) 처음에는 이중 for문 이용해서 N^2시간에 구하려고 했는데 직관적으로 시간초과가 예상되었다(N이 최대 10만)
1) priority queue를 이용한 두개의 heap을 통해 중간값을 구할 수 있다.
2) [조건 1] pqLeft의 크기는 pqRight와 같거나, 1 크다
[조건 2] pqLeft.top() 의 값은 -pqRight.top() 보다 항상 작다.
-> 크기가 같을 때, left에 push하므로 push 후 top을 확인하여, 재정렬 필요
*****
문제에 주어진 <예제 입력1> 실행 시 pqLeft, pqRight에 실제 들어있는 값
pqLeft : 기본 우선순위 큐 사용, 내림차순 정렬 (가장 큰 값이 top)
pqRight : 부호(-)를 붙여 오름차순 정렬 (가장 작은 값이 top)
pqLeft |
pqRight |
1 |
|
1 |
-5 |
2 1 |
-5 |
2 1 |
-5 -10 |
2 1 -99 |
-5 -10 |
2 1 -99 |
-5 -7 -10 |
5 2 1 -99 |
-5 -7 -10 |
각 단위에서 출력되는 pqLeft.top() 값
/**
* 200610
* 1655 가운데를 말해요
* Priority_queue & Heap
* */
#include <iostream>
#include <queue>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int N;
cin >> N;
priority_queue <int> pqLeft, pqRight;
int x;
for(int i=1; i<=N; i++){
cin >> x;
if(pqLeft.size() == pqRight.size())
pqLeft.push(x);
else
pqRight.push(-x);
if(!pqLeft.empty() && !pqRight.empty() && pqLeft.top()> -pqRight.top()){
int lPush = -pqRight.top();
int rPush = pqLeft.top();
pqLeft.pop();
pqRight.pop();
pqLeft.push(lPush);
pqRight.push(-rPush);
}
cout << pqLeft.top() << '\n';
}
return 0;
}
'BOJ' 카테고리의 다른 글
BOJ 1700 멀티탭 스케줄링 (0) | 2020.06.16 |
---|---|
BOJ 2824 최대공약수 (0) | 2020.06.13 |
BOJ 2151 거울 설치 (0) | 2020.06.10 |
BOJ 1600 말이 되고픈 원숭이 (0) | 2020.06.05 |
BOJ 1986 체스 (0) | 2020.06.05 |