반응형
문제 링크 : 1715번: 카드 정렬하기 (acmicpc.net)
1715번: 카드 정렬하기
정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장
www.acmicpc.net
>풀이
카드 묶음 중 가장 작은 두 개를 골라 합친다 -> 합친 두 카드를 카드 묶음에 넣는다 -> 반복
가장 작은 두개를 고르기 위해 정렬을 계속해서 반복해야 한다. 따라서 힙을 사용한 우선순위 큐를 써서 문제를 풀자
#include <bits/stdc++.h>
using namespace std;
priority_queue<int, vector<int>, greater<int> > pq;
int N;
int main(void)
{
int n;
int sum = 0;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
scanf("%d", &n);
pq.push(n);
}
while(pq.size() > 1) {
int n1, n2;
n1 = pq.top(), pq.pop();
n2 = pq.top(), pq.pop();
sum += (n1 + n2);
pq.push(n1 + n2);
}
printf("%d", sum);
return 0;
}
반응형
'알고리즘 (백준) > BOJ 길라잡이 (1)' 카테고리의 다른 글
백준 13305 (주유소) / C++ (0) | 2021.05.20 |
---|---|
백준 1655 (가운데를 말해요) / C++ (0) | 2021.05.18 |
백준 2805 (나무 자르기) / C++ (0) | 2021.05.13 |
백준 2512 (예산) / C++ (0) | 2021.05.12 |
백준 1654 (랜선 자르기) / C++ (0) | 2021.05.12 |