티스토리 뷰

문제

BOJ 15942 Thinking Heap

klimmek55 2018. 8. 3. 02:49

Thinking Heap
(http://boj.kr/15942)


방법은 여러가지가 있을 것 같다.
나는 이동이 전혀 일어나지 않도록 만들었다.
그 노드에 수를 넣었다면, 부모들은 자신보다 작아야하고, 자식들 중에 자신보다 작은건 없어야 한다.

어떻게 넣을지는 상관없다. 나는 자신보다 작아야 하는 수는 1부터 넣었고, 커야 하는 수는 n부터 넣었다. 그리고 상관없는건 남는 수들을 아무렇게나 넣었다.

불가능한 경우는 당연하게도, 작아야 하는 수의 개수가 자신보다 작은 수보다 많을 때와 커야하는 수의 개수가 자신보다 큰 수보다 많을 때이다. 그 외의 경우는 모두 가능하다.

 

더보기

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <bits/stdc++.h>
 
int n, cnt1, cnt2, cnt3, chk[200001];
 
void f(int now) {
    if (now > n)
        return;
 
    cnt2++;
    chk[now] = -1;
 
    f(now * 2);
    f(now * 2 + 1);
}
 
int main() {
    int m, k, t;
 
    scanf("%d %d %d"&n, &m, &k);
 
    t = k / 2;
    while (t >= 1) {
        cnt1++;
        chk[t] = 1;
        t /= 2;
    }
 
    f(k * 2);
    f(k * 2 + 1);
 
    if (cnt1 >= m || cnt2 > n - m) {
        printf("-1");
 
        return 0;
    }
 
    cnt3 = cnt1 + 1;
    cnt1 = 1;
    cnt2 = n;
    for (int i = 1;i <= n;++i) {
        if (i == k) 
            printf("%d\n", m);
        else if (chk[i] == 1)
            printf("%d\n", cnt1++);
        else if (chk[i] == 0) {
            if (cnt3 == m)
                cnt3++;
            printf("%d\n", cnt3++);
        }
        else
            printf("%d\n", cnt2--);
    }
 
    return 0;
}
cs

 

'문제' 카테고리의 다른 글

BOJ 1867 돌맹이 제거  (0) 2018.08.06
BOJ 15938 더위 피하기  (0) 2018.08.05
BOJ 15823 카드 팩 구매하기  (1) 2018.08.03
BOJ 15824 너 봄에는 캡사이신이 맛있단다  (0) 2018.08.03
BOJ 14434 놀이기구1  (0) 2018.08.03
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함