문제

boj15903_1 boj15903_2

현재 가진 카드들 중 값이 가장 작은 두 카드를 골라 값을 더하면 된다.

min 값을(min 값만) 계속 찾아야 하기 때문에 pq를 이용한다.

카드에 적힌 숫자의 범위가 1,000,000 이하이지만 계속 더하면서 int 범위를 초과할 수 있기 때문에 자료형은 long long

구현

#include <iostream>
#include <queue> // pq
using namespace std;

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

	int n, m, i;
	long long sum, tmp;
	priority_queue<long long> pq;

	cin >> n >> m;
	for (i = 0; i < n; i++) {
		cin >> tmp;
		pq.push(-tmp);
	}

	for (i = 0; i < m; i++) {
		tmp = -pq.top();
		pq.pop();
		tmp += (-pq.top());
		pq.pop();
		pq.push(-tmp);
		pq.push(-tmp);
	}

	sum = 0;
	while (!pq.empty()) {
		sum += (-pq.top());
		pq.pop();
	}

	cout << sum << endl;
	return 0;
}