728x90
728x90
https://www.acmicpc.net/problem/1927
1927번: 최소 힙
첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0
www.acmicpc.net
난이도: solved.ac 실버 2
그냥 우선순위 큐 구현 문제다
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define HEAP_LEN 100001
#define TRUE 1
#define FALSE 0
typedef int PriorityComp(int d1, int d2);
typedef struct _heap {
PriorityComp* comp;
int numOfData;
int arr[HEAP_LEN];
} Heap;
void HeapInit(Heap* ph, PriorityComp pc);
int HIsEmpty(Heap*);
int GetParentIDX(int);
int GetLChildIDX(int);
int GetRChildIDX(int);
int DataPriorityComp(int, int);
int GetHighPriChildIDX(Heap*, int);
void HInsert(Heap*, int);
int HDelete(Heap*);
int main() {
int N, num, i;
Heap heap;
HeapInit(&heap, DataPriorityComp);
scanf("%d", &N);
for (i = 0; i < N; i++) {
scanf("%d", &num);
if (num == 0)
printf("%d\n", HDelete(&heap));
else
HInsert(&heap, num);
}
return 0;
}
int DataPriorityComp(int d1, int d2) {
return d1 - d2;
}
void HeapInit(Heap* ph, PriorityComp pc) {
ph->numOfData = 0;
ph->comp = pc;
}
int HIsEmpty(Heap* ph) {
if (ph->numOfData == 0)
return TRUE;
else return FALSE;
}
int GetParentIDX(int idx) {
return idx / 2;
}
int GetLChildIDX(int idx) {
return idx * 2;
}
int GetRChildIDX(int idx) {
return idx * 2 + 1;
}
int GetHighPriChildIDX(Heap* ph, int idx) {
if (GetLChildIDX(idx) > ph->numOfData)
return 0;
else if (GetLChildIDX(idx) == ph->numOfData)
return GetLChildIDX(idx);
else {
if (ph->comp(ph->arr[GetLChildIDX(idx)], ph->arr[GetRChildIDX(idx)]) < 0)
return GetLChildIDX(idx);
else return GetRChildIDX(idx);
}
}
void HInsert(Heap* ph, int data) {
int idx = ph->numOfData + 1;
while (idx != 1) {
if (ph->comp(data, ph->arr[GetParentIDX(idx)]) < 0) {
ph->arr[idx] = ph->arr[GetParentIDX(idx)];
idx = GetParentIDX(idx);
}
else break;
}
ph->arr[idx] = data;
(ph->numOfData)++;
}
int HDelete(Heap* ph) {
if (HIsEmpty(ph))
return 0;
int retData = ph->arr[1];
int lastElem = ph->arr[ph->numOfData];
int parentIdx = 1;
int childIdx;
while (childIdx = GetHighPriChildIDX(ph, parentIdx)) {
if (ph->comp(lastElem, ph->arr[childIdx]) <= 0)
break;
ph->arr[parentIdx] = ph->arr[childIdx];
parentIdx = childIdx;
}
ph->arr[parentIdx] = lastElem;
(ph->numOfData)--;
return retData;
}
반응형