본문 바로가기
PS/BOJ

백준 13975 / C++

by jaehoonChoi 2022. 7. 21.

https://www.acmicpc.net/problem/13975

 

13975번: 파일 합치기 3

프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T개의 테스트 데이터로 이루어져 있는데, T는 입력의 맨 첫 줄에 주어진다.각 테스트 데이터는 두 개의 행으로 주어지는데,

www.acmicpc.net

 

[ 풀이 ] 

 

한번 합친 비용은 이후에 계속해서 더해진다.  즉, 처음에 작게 합칠수록 무조건 유리하다. 

이제 작은것부터 2개씩 합쳐주면서 그걸 계속 더해나가면 된다.  

n제한이 1e6이므로 매번 작은걸 2개씩 골라주는건 우선순위큐로 찾아주면 O(logn)에 찾을 수 있다.

이제 구현만 해주면 된다. 최악의 경우 1e10이므로 long long을 써주자. 

 

[ 코드 ]

 

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll tc, n, a[1000001];

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    cin >> tc;
    while (tc--) {
        cin >> n;
        priority_queue<ll> pq; // 디폴트가 큰것부터 
        for (int i = 1; i <= n; i++) {
            cin >> a[i];
            pq.push(-a[i]); // 음수 붙여주면 a[i]가 작은것부터 
        }
        ll sum = 0;
        // 원소가 2개이상 있을때까지 작은거 2개 뽑아서 더하고 다시 넣는다. 
        while (pq.size() > 1) {
            ll x = pq.top(); pq.pop();
            ll y = pq.top(); pq.pop();
            sum += (x + y);
            pq.push(x + y);
        }
        cout << -sum << '\n';
    }
}

 

 

'PS > BOJ' 카테고리의 다른 글

백준 9251 / C++  (0) 2022.07.21
백준 10942 / C++  (0) 2022.07.21
백준 12099 / C++  (0) 2022.07.15
백준 2805 / C++  (0) 2022.07.15
백준 16118 / C++  (0) 2022.07.15

댓글