※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 1477번 문제인 휴게소 세우기이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/1477 

 

1477번: 휴게소 세우기

첫째 줄에 현재 휴게소의 개수 N, 더 지으려고 하는 휴게소의 개수 M, 고속도로의 길이 L이 주어진다. N은 100보다 작거나 같으며, M도 100보다 작거나 같다. L은 100보다 크거나 같고, 1000보다 작거나

www.acmicpc.net

고속도로에 M개의 휴게소를 추가로 설치하여 휴게소가 없는 구간의 길이의 최댓값을 최소화하고자하는 문제이다.

 

구간의 길이 dist는 0 이상 (고속도로 전체 길이) 이하이다.

이 범위에서 휴게소가 없는 구간의 길이가 dist 이하가 되게끔 설치해야하는 최소 휴게소의 수와 M을 비교하여 이분탐색을 진행하는 것으로 문제를 해결할 수 있다.

 

고속도로의 시점과 첫 휴게소 사이, 마지막 휴게소와 고속도로의 종점 사이 또한 "휴게소가 없는 구간"에 해당함에 유의하여 구현하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <algorithm>
using namespace std;

int N, M, D;
int arr[102];

int func(int dist) { // 휴게소 간격 dist 이하가 되게끔 최소한 적은 휴게소 배치
    int ret = 0;
    for (int i = 1; i < N; i++) {
        int d = arr[i] - arr[i - 1];
        ret += (d - 1) / dist;
    }

    return ret;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> N >> M >> D;
    for (int i = 0; i < N; i++) cin >> arr[i];
    arr[N] = D;
    N += 2;
    sort(arr, arr + N);

    int L = 1, R = D;
    while (L < R) {
        int mid = (L + R) / 2;
        int val = func(mid);
        if (val > M) L = mid + 1;
        else R = mid;
    }

    cout << L;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 2512 // C++] 예산  (0) 2021.11.04
[BOJ 3896 // C++] 소수 사이 수열  (0) 2021.11.03
[BOJ 2110 // C++] 공유기 설치  (0) 2021.11.01
[BOJ 2819 // C++] 상근이의 로봇  (0) 2021.10.31
[BOJ 1450 // C++] 냅색문제  (0) 2021.10.30

+ Recent posts