
그리디와 우선순위 큐를 이용하는 문제
처음 생각에는 그냥 오름차순 정렬해서 더해주면 되는거 아닌가? 했는데, 합치는 과정에서 정렬을 또 해줘야 했음..
pq에 넣어준다.pq가 빌 때까지 돌아가는데, 맨 위에 카드 뭉치 두개 뽑은게 n1과 n2가 된다.answer에 n1+n2를 더해주고 (지금까지 비교한 수 저장), 카드 뭉치 두개를 합쳐 다시 pq에 넣어준다.pq에 하나가 남을테니 카드 뭉치 하나를 뽑고 pq가 비면 break 해준다.#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main(void)
{
int n;
cin >> n;
priority_queue<int, vector<int>, greater<int>> pq;
for (int i = 0; i < n; i++)
{
int num;
cin >> num;
pq.push(num);
}
int answer = 0;
while (!pq.empty())
{
int n1, n2;
n1 = pq.top(); pq.pop();
if (pq.empty()) break;
n2 = pq.top(); pq.pop();
answer += n1 + n2;
pq.push(n1 + n2);
}
cout << answer << endl;
return 0;
}