-
[15903] 카드 합체 놀이BOJ 2021. 10. 14. 06:36
https://www.acmicpc.net/problem/15903
15903번: 카드 합체 놀이
첫 번째 줄에 카드의 개수를 나타내는 수 n(2 ≤ n ≤ 1,000)과 카드 합체를 몇 번 하는지를 나타내는 수 m(0 ≤ m ≤ 15×n)이 주어진다. 두 번째 줄에 맨 처음 카드의 상태를 나타내는 n개의 자연수 a1,
www.acmicpc.net
<문제>
그리디적으로 생각해서, 가장 작은거 두개를 골라서 연산을 진행해주면 된다.
이를 m번 반복해야하는데, 항상 필요한건 작은거 2개이므로 우선순위큐를 사용하여 구현하면 편리하다.
<소스코드>
123456789101112131415161718192021222324252627282930#include <stdio.h>#include <algorithm>#include <queue>using namespace std;priority_queue<long long> q;int n, m;int main(void) {int i, j, cnt = 0;long long y, x, temp, sum = 0;scanf("%d %d", &n, &m);for (i = 0; i < n; i++) {scanf("%lld", &temp);sum += temp;q.push(-temp);}while (cnt < m) {y = -q.top();q.pop();x = -q.top();q.pop();sum += (y + x);q.push(-(y + x));q.push(-(y + x));cnt++;}printf("%lld", sum);return 0;}cs 'BOJ' 카테고리의 다른 글
[2667] 단지번호붙이기 (0) 2021.10.16 [16946] 벽 부수고 이동하기 4 (0) 2021.10.16 [2636] 치즈 (0) 2021.10.14 [2573] 빙산 (0) 2021.10.14 [1325] 효율적인 해킹 (0) 2021.10.14