• 분류 전체보기
    • 갈무리
    • 씨플플
    • SPRING
    • PI
    • ALGORITHM
    • DIARY
    • (∗❛ᴗ❛∗)
    • (●'◡'●)
    • 민디의 취준일기 (202301~)
  1. [1012] 유기농 배추 2021.02.05
  2. [C/C++] 합병정렬 2020.04.01
  3. [2792] 보석상자 2020.04.01
  4. [10026] 적록색약 2020.03.09
[1477] 휴게소 세우기 #ALGORITHM
2020. 4. 1.

삼성에서 이제 STL 못쓰게 막아놨대서... 직접 정렬을 구현했다.

정렬구현하는시간 > 문제푼시간

 

더보기
이분탐색은 'X에 대해 이 답이 가능해? (응/아니)' 라고 답할 수 있는 문제에 적용할 수 있는데

문제 예시에서
> 구간의 길이가 최대 251일때 다솜이가 고속도로에 새로 세울 수 있는 휴게소의 개수는 몇개일까요?
> 그럼 구간의 길이가 최대 125라면 다솜이가 고속도로에 새로 세울 수 있는 휴게소의 개수는 몇개일까요?

 

 

 

 

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
int n, m, res = 1000000000;
 
int position[101];
int difference[101];
 
void merge_sort(int left, int right) {
    // partition
    if (left < right) {
        int mid = (left + right) / 2;
        merge_sort(left, mid);
        merge_sort(mid + 1, right);
 
        // merge
        int temp[100];
        int i = left, j = mid + 1;
        int idx = 0;
        while (i <= mid && j <= right) {
            if (position[i] < position[j]) temp[idx++] = position[i++];
            else temp[idx++] = position[j++];
        }
        // 남은거
        while (i <= mid) {
            temp[idx++] = position[i++];
        }
        while (j <= right) {
            temp[idx++] = position[j++];
        }
        idx = 0;
        for (int i = left; i <= right; i++) {
            position[i] = temp[idx++];
        }
    }
}
 
int max(int first, int second) {
    if (first > second) return first;
    else return second;
}
 
int min(int first, int second) {
    if (first > second) return second;
    else return first;
}
 
bool solve(int mid) {
    int num = 0;
    for (int i = 0; i < n + 1; i++) {
        num += difference[i] / mid;
        if (!(difference[i] % mid)) {
            num -= 1;
        }
    }
    if (num > m) return false;
    else return true;
}
int main() {
    int L;
    
    scanf("%d %d %d", &n, &m, &L);
 
    int left = 0, right = 0;
 
    for (int i = 0; i < n; i++) {
        scanf("%d", &position[i]);
    }
    position[n] = L;
 
 
    merge_sort(0, n);
 
    int prev = 0;
 
    for (int i = 0; i < n + 1; i++) {
        difference[i] = position[i] - prev;
        prev = position[i];
        right = max(right, difference[i]);
    }
 
    while (left <= right) {
        int mid = (left + right) / 2;
        if (solve(mid)) {
            res = min(res, mid);
            right = mid - 1;
        }
        else {
            left = mid + 1;
        }
    }
    printf("%d\n", res);
}
 
Colored by Color Scripter
cs

 

티스토리툴바