반응형

문제 링크 : 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;
}

 

반응형

+ Recent posts