https://www.acmicpc.net/problem/13975
[ 풀이 ]
한번 합친 비용은 이후에 계속해서 더해진다. 즉, 처음에 작게 합칠수록 무조건 유리하다.
이제 작은것부터 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 |
댓글