https://www.acmicpc.net/problem/1655
1655번: 가운데를 말해요
첫째 줄에는 수빈이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 수빈이가 외치는 정수가 차례대로 주어진다. 정수는 -1
www.acmicpc.net
짭 중간값 구하는 문제 !
시간 제한이 0.1초에 데이터의 삽입이 끊임없이 이뤄지므로 수행속도가 빠른 heap을 사용한다
max heap : 가장 큰 값이 top (기준 값보다 작은 값들을 나열, 기준 값 포함)
기준 값 !
min heap : 가장 작은 값이 top (기준 값보다 큰 값들을 나열, 기준 값 제외)
해서 중간값이 max heap 의 top에 위치하도록 한다.
= max heap 의 사이즈가 min heap 과 같거나 하나 크다.
짝수개 있을 땐 중간값 두개 중에 작은 값을 출력하라고 했으니 max heap 의 top 에 위치하도록 한다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int N, num;
priority_queue<int> small; // max heap
priority_queue<int, vector<int>, greater<int>> big; // min heap
int main(int argc, const char * argv[]) {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> N;
cin >> num;
small.push(num);
cout << num << "\n";
N--;
while (N--) {
cin >> num;
if (num < small.top()) {
small.push(num);
}
else {
big.push(num);
}
if ((int)small.size() < (int)big.size()) {
small.push(big.top());
big.pop();
}
else if ((int)small.size() > (int)big.size() + 1) {
big.push(small.top());
small.pop();
}
cout << small.top() << "\n";
}
return 0;
}
'ALGORITHM > OTHER' 카테고리의 다른 글
[c++] 2042 구간 합 구하기 (세그먼트 트리) (0) | 2021.03.02 |
---|---|
[c++] 11723 집합 (비트마스크) (0) | 2021.02.13 |
[c++] 11054 가장 긴 바이토닉 부분 수열 (이분탐색) (0) | 2021.02.03 |
[c++] 2805 나무 자르기 (이분탐색) (0) | 2021.01.29 |
[c++] 1654 랜선 자르기 (파라메트릭 서치(Parametric Search)) (0) | 2021.01.28 |