post image post image post image post image post image post image post image post image

https://www.acmicpc.net/problem/1715

 

1715번: 카드 정렬하기

정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장

www.acmicpc.net

 

간단하게 설명하면 카드 뭉치들이 여러개가 있는데 이 중 두개의 카드 뭉치를 골라 하나로 합치는데 드는 힘이 두 카드뭉치들의 카드 수의 합이라고 할 때, 최소의 힘으로 모든 카드 뭉치를 합치는 문제이다.

 

우선순위 큐를 사용하여 현재 상태에서 가장 카드 수가 적은 카드 뭉치 두 개를 꺼내 합치고 그 결과로 생긴 하나의 카드뭉치를 다시 우선순위 큐에 넣어 반복하는 방법으로 문제를 해결했다.

 

#include <iostream>
#include <queue>

using namespace std;

int main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int n; cin >> n;
	int tmp, ans = 0;
	priority_queue<int> pq;

	while (n--) {
		cin >> tmp;
		pq.emplace(-tmp);
	}

	//pq에서 두 개씩 꺼내서 합치고 최종적으로 하나가 남으므로 pq.size() > 1인 동안에
	while (pq.size() > 1) {
		tmp = 0;
		tmp += pq.top(); pq.pop();
		tmp += pq.top(); pq.pop();

		ans -= tmp;
		pq.emplace(tmp);
	}

	cout << ans;
	return 0;
}
메모리: 2916 kb 시간: 20 ms

'컴퓨터 사이언스 > 1고리즘' 카테고리의 다른 글

백준 17406 : 배열 돌리기 4  (0) 2021.07.23
백준 16926 : 배열 돌리기 1  (0) 2021.07.22
백준 2346 : 풍선 터뜨리기  (0) 2021.07.21
백준 1918 : 후위표기식  (0) 2021.07.20
백준 12757 : 전설의 JBNU  (0) 2021.07.19

+ Recent posts