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; }
반응형