백준 문제/그리디

[백준] 15903번 카드 합체 놀이

dubu0721 2025. 2. 26. 17:33

문제: 15903번: 카드 합체 놀이

basic-algo-lecture/workbook/0x11.md at master · encrypted-def/basic-algo-lecture

 

basic-algo-lecture/workbook/0x11.md at master · encrypted-def/basic-algo-lecture

바킹독의 실전 알고리즘 강의 자료. Contribute to encrypted-def/basic-algo-lecture development by creating an account on GitHub.

github.com

 

#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
//#include <bits/stdc++.h>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n, m;
    cin >> n >> m;
    // 최소힙으로 동작하도록..
    priority_queue<long long, vector<long long>, greater<long long>> cards;
    for (int i = 0; i < n; i++) {
        int tmp;
        cin >> tmp;
        cards.push(tmp);
    }
    while (m-- > 0) {
        long long num1 = cards.top(); cards.pop();
        long long num2 = cards.top(); cards.pop();

        // 서로 더해서 다시 넣기
        cards.push(num1 + num2);
        cards.push(num1 + num2);
    }
    long long sum = 0;
    while (!cards.empty()) {
        sum += cards.top(); cards.pop();
    }
    cout << sum;

    return 0;
}

 

흠.. 그냥 최소힙 만든 다음에 while 문 돌면서 가장 작은 값 두개 빼고 서로 더한 후 다시 넣어주면 된다. 이렇게 하면 나중에 모든 카드를 다 더했을 때 최솟값이 나온다.