백준/그리디

[백준 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

반응형

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

[백준 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

댓글