알고리즘 문제 풀이/1DP_과제(~180615)

171107_최소힙

2017. 11. 7. 15:49

#include <iostream>

#include <algorithm>

using namespace std;

void upheap(int index);

int downheap(int index, int node);

void heap_sort(int node);

void swap(int *a, int *b);


int arr[100000];

void swap(int *a, int *b)

{

int tmp = *a;

*a = *b;

*b = tmp;

}

void heap_sort(int node)

{

arr[0] = arr[node];

arr[node] = NULL;

if (node > 2) {

int tmp = 0;

downheap(tmp, node);

}

else //node==2

if (arr[0] < arr[1]) swap(&arr[0], &arr[1]);

}

int downheap(int index, int node)

{

int left = index * 2 + 1;

int right = index * 2 + 2;

if (node == 0 || arr[left] == NULL) return 0;

else if (node - 1 == left)

{

if (arr[index] > arr[left])

{

swap(&arr[index], &arr[left]);

index = left;

}

return 0;

}

else if (node - 1 == right)

{

if (arr[left] < arr[right])

{

if (arr[index] > arr[left])

{

swap(&arr[index], &arr[left]);

index = right;

}

}

else //(arr[left] > arr[right])

{

if (arr[index] > arr[right])

{

swap(&arr[index], &arr[right]);

index = right;

}

}

return 0;

}

else

{

if (arr[left] < arr[right])

{

if (arr[index] > arr[left])

{

swap(&arr[index], &arr[left]);

index = left;

}

}

else //arr[left] > arr[right]

if (arr[index]>arr[right])

{

swap(&arr[index], &arr[right]);

index = right;

}

downheap(index, node);

}


}

void upheap(int index)

{

if (index != 0)

if (index % 2)

{

if (arr[index / 2] > arr[index])

{

swap(&arr[index / 2], &arr[index]);

index /= 2;

upheap(index);

}

}

else

{

if (arr[(index - 1) / 2] > arr[index])

{

swap(&arr[(index - 1) / 2], &arr[index]);

index = (index - 1) / 2;

upheap(index);

}

}

}

int main()

{

int N;

cin >> N;

int node = 0;

int index;

fill(arr, arr + 100000, NULL);

for (int i = 0; i<N; i++)

{

int x;

cin >> x;

if (x == 0)

{

cout << arr[0] << endl;

if (node != 0) node--;

heap_sort(node);

}

else

{

index = node;

arr[node] = x;

node++;

upheap(index);

}

}

}


예외처리 무엇을 빠뜨렸을까..

저작자표시 비영리

'알고리즘 문제 풀이 > 1DP_과제(~180615)' 카테고리의 다른 글

171108_원재의 벽 꾸미기  (0) 2017.11.08
171107_암호문3  (0) 2017.11.07
171106_1234_비밀번호  (0) 2017.11.06
171105_1228_암호문1  (0) 2017.11.05
171104_1225_암호생성기  (0) 2017.11.04
'알고리즘 문제 풀이/1DP_과제(~180615)' 카테고리의 다른 글
  • 171108_원재의 벽 꾸미기
  • 171107_암호문3
  • 171106_1234_비밀번호
  • 171105_1228_암호문1
bong sue
bong sue
취업 준비하면서 공부하던 블로그인데, 이제 나이가 먹어가니까 사는 준비도 해야해서 이거저거 씁니다.
bong sue
수봉수봉 신변잡기
bong sue
전체
오늘
어제
  • 분류 전체보기 (268)
    • 알고리즘 문제 풀이 (264)
      • AtCoder 문제 풀기 (4)
      • 코딩 테스트 대비(~211220) (14)
      • 1DP_과제(~180615) (246)
    • Engineering (1)
      • 디자인패턴 (0)
      • 프로그래밍 언어론 (1)
    • 독서 (0)
      • 고전 읽기 프로젝트 (0)
      • 재테크 (0)
    • 내 집 마련 (단기 프로젝트) (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • 탐색
  • bruteforce
  • BOJ
  • 수학
  • C언어
  • 삼성
  • BFS
  • 동적계획
  • 브루트 포스
  • 그리디알고리즘
  • sort
  • 구현
  • 시뮬레이션
  • 문자열
  • 백준저지
  • 문자열처리
  • ABC
  • AtCoder
  • 알고스팟
  • 1032
  • 탐욕알고리즘
  • C++
  • 브루트포스
  • 백준
  • dp
  • dfs
  • 042
  • Sea
  • Olympiad
  • 정렬

최근 댓글

최근 글

hELLO · Designed By 정상우.
bong sue
171107_최소힙
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.