티스토리 뷰

문제(1초-추가 시간 없음 / 512MB)

  석환이는 아기다. 아기 석환이는 자연수가 쓰여져있는 카드를 갖고 다양한 놀이를 하며 노는 것을 좋아한다. 오늘 아기 석환이는 무슨 놀이를 하고 있을까? 바로 카드 합체 놀이이다!

  아기 석환이는 자연수가 쓰여진 카드를 n장 갖고 있다. 처음에 i번 카드엔 ai가 쓰여있다. 카드 합체 놀이는 이 카드들을 합체하며 노는 놀이이다. 카드 합체는 다음과 같은 과정으로 이루어진다.

  1. x번 카드와 y번 카드를 골라 그 두 장에 쓰여진 수를 더한 값을 계산한다. (x ≠ y)
  2. 계산한 값 x번 카드와 y번 카드 두 장 모두에 덮어 쓴다.

  이 카드 합체를 총 m번 하면 놀이가 끝난다. m번의 합체를 모두 끝낸 뒤, n장의 카드에 쓰여있는 수를 모두 더한 값이 이 놀이의 점수가 된다. 이 점수를 가장 작게 만드는 것이 놀이의 목표이다.

  아기 석환이는 수학을 좋아하긴 하지만, 아직 아기이기 때문에 점수를 얼마나 작게 만들 수 있는지를 알 수는 없었다(어른 석환이는 당연히 쉽게 알 수 있다). 그래서 문제 해결 능력이 뛰어난 여러분에게 도움을 요청했다. 만들 수 있는 가장 작은 점수를 계산하는 프로그램을 만들어보자.

입력

  첫 번째 줄에 카드의 개수를 나타내는 수 n(2 ≤ n ≤ 1,000)과 카드 합체를 몇 번 하는지를 나타내는 수 m(0 ≤ m ≤ 15×n)이 주어진다.

  두 번째 줄에 맨 처음 카드의 상태를 나타내는 n개의 자연수 a1, a2, …, an이 공백으로 구분되어 주어진다. (1 ≤ ai ≤ 1,000,000)

출력

  첫 번째 줄에 만들 수 있는 가장 작은 점수를 출력한다.

예제 입력 1 복사

3 1

3 2 6

예제 출력 1 복사

16

예제 입력 2 복사

4 2

4 2 3 1

예제 출력 2 복사

19


문제 접근

  카드의 수를 나타내는 n / 몇 번 합체해야 하는지 알려주는 m을 input으로 받는다.

 

  가장 작은 수를 만드는 것이 목표라고 한다. 그렇다면 일단 x와 y라는 가장 작은 값을 찾은 다음 둘의 값을 합친 후 x와 y에다가 합친 값을 더해 준다. 그리고 우선순위 큐에 넣어 또 가장 작은 x와 y를 찾아 이걸 m번 반복해준다.

 

1. 우선순위 큐에 모든 카드를 집어넣는다.

2. 가장 작은 x와 y를 우선순위에서 꺼낸다.

3. 둘을 합체시킨 후 그 값을 x와 y에 덮어 쓴후 다시 우선순위 큐에 넣는다.

4. count를 한번 해준후, 아직 count가 m과 같지않다면, 2번 과정으로 돌아간다.

 

/* 카드 합체 놀이 */
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#define MAX 1001

using namespace std;

int n, m, cnt = 0;
long long int ans = 0;
long long int card[MAX];
priority_queue<long long int, vector<long long int>, greater<long long int>> pq;

int main(void) {
	cin >> n >> m;
	for(int i = 0; i < n; i++) {
		long long int temp;
		cin >> temp;
		pq.push(temp);
	}
	while(cnt != m) {
		long long int x, y;
		
		x = pq.top(); pq.pop();
		y = pq.top(); pq.pop();
		
		pq.push(x + y);
		pq.push(x + y);
		
		cnt++;
	}
	for(int i = 0; i < n; i++) {
		ans += pq.top(); pq.pop();
	}
	cout << ans << endl;
	return 0;
}

'Algorithm > baekjoon' 카테고리의 다른 글

1449_수리공 항승  (0) 2020.08.25
15904_UCPC의 약자는 무엇의 약자일까요?  (0) 2020.08.25
2810_컵홀더  (0) 2020.08.24
13305_주유소  (0) 2020.08.23
2847_게임을 만든 동준이  (0) 2020.08.22
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함