본문 바로가기

알고리즘 문제 풀이/Baekjoon

15903 - 카드 합체 놀이

반응형
SMALL

 

 

15903번: 카드 합체 놀이

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

www.acmicpc.net

 

최소힙, 타입 조심

 

#include <stdio.h>

int N, M;

typedef long long LL;

const int LN = 1e3 + 10;

void swap(LL& x, LL& y) { LL z = x; x = y; y = z; }
int minComp(LL x, LL y) { return x < y; }

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

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

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

    for (int c = hn; c > 1; c = c / 2) {
      if (comp(heap[c], heap[c / 2])) { swap(heap[c / 2], heap[c]); }
      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 / 2], heap[c]); }
      else break;
    }

    return heap[hn + 1];
  }

} minq;

void init() {
  minq.init();
  
  scanf("%d %d", &N, &M);

  for(int n = 0; n < N; ++n) {
    LL t;

    scanf("%lld ", &t);

    minq.push(t);   
  }
}

void calculate() {
  for (int m = 0; m < M; ++m) {
    LL O, P; 

    O = minq.pop();
    P = minq.pop();

    minq.push(O + P);
    minq.push(O + P);
  }
}

void print() {
  LL R = 0;

  while(minq.hn) {
    R += minq.pop();
  }

  printf("%lld", R);
}

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

  init();

  calculate();

  print();

  return 0;
}

 

파일 읽는 구문 주석도 조심..

 

흐엉 ㅠ

반응형
LIST

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

14235 - 크리스마스 선물  (0) 2023.12.21
1417 - 국회의원 선거  (1) 2023.12.20
11931 - 수 정렬하기 4  (0) 2023.12.19
10867 - 중복 빼고 정렬하기  (0) 2023.12.19
10808 - 알파벳 갯수  (0) 2023.12.18