https://www.acmicpc.net/problem/13975
13975번: 파일 합치기 3
프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T개의 테스트 데이터로 이루어져 있는데, T는 입력의 맨 첫 줄에 주어진다.각 테스트 데이터는 두 개의 행으로 주어지는데,
www.acmicpc.net
우선순위 큐 사용 문제.
하나의 우선순위 큐에 임시파일을 포함한 모든 파일들을 저장해놓고,
실시간으로 가장 비용이 작은 두개의 파일을 합쳐서 하나의 임시파일로 만들어주면 된다.
이 과정을 파일이 하나만 남을때까지 반복해주면 되고,
전체 시간복잡도는 O(KlogK) 이다.
입력되는 수의 갯수가 1e6으로 꽤나 많으니 fastio를 써야 할 듯 하고,
수의 범위가 int값을 넘어가니까 long long 형으로 선언해준 다음
C언어 기준 PQ의 우선순위를 정 반대로 바꿔주어야 한다.
PQ의 우선순위를 바꾸는 두 가지 방법으로
첫번째는 greater<ll> 을 사용하는 방법이 있고,
두번째는 모든 값에 -1을 곱해서 음수로 저장했다가 꺼낼때 다시 -1을 곱해주는 방법이 있다.
취향껏 사용해주면 된다.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
cin.sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int T;
cin >> T;
while(T--){
priority_queue<ll, vector<ll>, greater<ll>> pq;
ll N,K;
ll ans = 0;
cin >> N;
for(int i=0; i<N; i++){
cin >> K;
pq.push(K);
}
while(pq.size() > 1){
ll a = pq.top(); pq.pop();
ll b = pq.top(); pq.pop();
ans += a+b;
pq.push(a+b);
}
cout << ans << "\n";
}
return 0;
}
반응형