본문 바로가기
알고리즘/자료 구조

백준 15903번 : 카드 합체 놀이

by Jason95 2021. 1. 5.

문제 링크 : www.acmicpc.net/problem/15903

내 풀이(2021.1.4.) : 

#include <iostream>
#include <queue>

using namespace std;

priority_queue<long long, vector<long long>, greater<long long>> pq;
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n, m; cin >> n >> m;
	for (int i = 0; i < n; i++) {
		long long temp; cin >> temp; pq.push(temp);
	}
	for (int i = 0; i < m; i++) {
		long long temp1 = pq.top(); pq.pop();
		long long temp2 = pq.top(); pq.pop();
		pq.push(temp1 + temp2);
		pq.push(temp1 + temp2);
	}

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

	return 0;
}

카드 1,000장이 모두 1,000,000라는 숫자가 적혀있는 경우를 생각했을 때
합체를 최대 15,000번까지 할 수 있으니

합이 15,000 x 1,000,000 = 150억이 될 수도 있다. 
int는 20억까지만 표현할 수 있으니, 오버플로우가 발생하지 않도록 long long을 써야 한다.