큐(Queue)

백준 1715번: 카드 정렬하기

cepiloth 2018. 8. 5. 15:27
반응형

 

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

 

1715번: 카드 정렬하기

정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장의 숫자 카드 묶음을 합치려면 50번의 비교가 필요하다. 매우 많은 숫자 카드 묶음이 책상 위에 놓여 있다. 이들을 두 묶음씩 골라 서로 합쳐나간다면, 고르는 순서에 따라서 비교 횟수가 매우 달라진다. 예를 들어 10장, 20장, 40장의 묶음이 있다면

www.acmicpc.net

 

키워드 - 힙, 구현, 우선순위큐

 

Approach

정수 10 20 40 이 입력으로 들어오고 큐에 쌓이는 순서는 10 20 40

최상위 두개의 값을 pop 을 하여 10 + 20 덧셈을 다시 큐에 넣으면 30, 40

 

다음 상태에서 30 + 40 = 70 

 

총 비교회수는 100(30 + 70) 이 된다.

 

Source

#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>
#include <functional>
#include <vector>
#include <list>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <stack>
#include <math.h>
#include <memory.h>
using namespace std;

#define MAX_SIZE 100
#define INF 0x7fffffff
#define CENDL "\n"
#define ll long long

int main() {

    cin.tie(0);
    std::ios::sync_with_stdio(false);

    int n; cin >> n;

    priority_queue<int, vector<int>, greater<int> > q;
    while (n--) {
        int d; cin >> d;
        q.push(d);
        // 순차적으로 모두 넣어줌
    }

    int sol = 0;
    while (q.size() > 1) {
        int a = q.top(); q.pop();
        int b = q.top(); q.pop();
        sol += a + b;
        q.push(a + b);
    }

    cout << sol << CENDL;

    return 0;
}
​

 

 

반응형