백준/그리디

[백준 15903번 / C++ / 그리디] 카드 합체 놀이

배발자 2022. 6. 28.

목차

    반응형

    우선순위 큐에 대한 자료구조를 알고 있으면 해당 문제는 상당히 쉽게 풀린다. 

     

    #접근방법 

     

    먼저, 그리디하게 접근을 해야한다. 

    가장 작은수를 만들기 위해선 어떻게 해야할까? 

     

    직관적으로 생각해봤을 때도 바로 느낌이 올 것이다. 가장 작은 수부터 차례대로 더해야한다.

    하지만 벡터나 배열로 생성하였을 경우 매번 오름차순으로 정렬하는 것은 번거롭다. 그렇기 때문에 우선순위 큐를 활용하자는 것이다.  

     

    즉, 카드의 개수만큼 입력받아서 최소힙으로 만들면 되는것이다. 

     

    4, 2 , 3 , 1 을 입력값으로 받았다면 1을 top 으로 가진 최소힙으로 구성되어지고

    top 위치한 두개의 노드를 pop 해서 더한 결과를 두번 push 해주면 된다.  가장 작은 값이 항상 top 에 위치하는 최소힙 자료구조를 활용하면 이 문제는 쉽게 풀수 있을것이다. 

     

    
      
    #include <queue>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    priority_queue<ll, vector<ll>, greater<ll>> q;
    int main() {
    int n; cin >> n;
    int m; cin >> m;
    for (int i = 0; i < n; i++) {
    ll a; cin >> a;
    q.push(a);
    }
    while (m--) {
    ll a, b;
    a = q.top();
    q.pop();
    b = q.top();
    q.pop();
    q.push(a + b);
    q.push(a + b);
    }
    ll sum = 0;
    while (!q.empty()) {
    sum += q.top();
    q.pop();
    }
    cout << sum;
    }

     

     

    15903번: 카드 합체 놀이

    첫 번째 줄에 카드의 개수를 나타내는 수 n(2 ≤ n ≤ 1,000)과 카드 합체를 몇 번 하는지를 나타내는 수 m(0 ≤ m ≤ 15×n)이 주어진다. 두 번째 줄에 맨 처음 카드의 상태를 나타내는 n개의 자연수 a1,...

    www.acmicpc.net

    [백준 15903번 / C++ / 그리디] 카드 합체 놀이

    반응형

    '백준 > 그리디' 카테고리의 다른 글

    [백준 1461번 / C++] 도서관  (0) 2022.04.06
    [백준 13904번 / C++] 과제  (0) 2022.04.05
    [백준 12904번 / C++] A와 B  (0) 2022.04.05
    [백준 1449번 / C++] 수리공 항승  (0) 2022.04.05
    [백준 13458번 / C++] 시험 감독  (0) 2022.03.31

    댓글