본문 바로가기

알고리즘 문제 풀이/Baekjoon

1715 - 카드 정렬하기

반응형
SMALL

 

 

1715번: 카드 정렬하기

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

www.acmicpc.net

 

#include <stdio.h>

typedef long long LL;

const int LN = 1e5 + 10;

int minComp(LL x, LL y) { return x < y; }

void swap(LL& x, LL& y) { LL z = x; x = y; y = z; }

LL R;
int N;
int T;

struct PQ {
  int hn;
  LL heap[LN];
  int (*comp)(LL x, LL y);

  void init() {
    hn = 0;
    comp = minComp;
  }

  void push(LL x) {
    heap[++hn] = x;

    for (int c = hn; c > 1; c /= 2) {
      if (comp(heap[c], heap[c / 2])) { swap(heap[c], heap[c / 2]); }
      else break;
    }
  }

  LL pop() {
    swap(heap[1], heap[hn--]);

    for (int c = 2; c <= hn; c *= 2) {
      if (c < hn && comp(heap[c + 1], heap[c])) { c++; }
      if (comp(heap[c], heap[c / 2])) { swap(heap[c], heap[c / 2]); }
      else break;
    }

    return heap[hn + 1];
  }
} minpq;

void init() {
  minpq.init();

  scanf("%d", &N);

  for (int n = 0 ; n < N; ++n) {
    scanf("%d", &T);

    minpq.push(T);
  }
}

void calculate() {
  LL a, b;

  while (minpq.hn) {
    a = minpq.pop();

    if (minpq.hn) {
      b = minpq.pop();
  
      minpq.push(a + b);

      R += (a + b);
    }

  }
}

int main(void) {
  // freopen("1715.txt", "r", stdin);

  init();

  calculate();

  printf("%lld", R);

  return 0;
}

 

이만치하면 됐다

반응형
LIST

'알고리즘 문제 풀이 > Baekjoon' 카테고리의 다른 글

1777 - 순열복원  (2) 2023.12.22
1306 - 달려라 홍준  (1) 2023.12.21
14235 - 크리스마스 선물  (0) 2023.12.21
1417 - 국회의원 선거  (1) 2023.12.20
15903 - 카드 합체 놀이  (1) 2023.12.20