algorithm/Binary Search

백준 2805 나무 자르기

hw.kr 2022. 9. 22. 13:00

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

 

2805번: 나무 자르기

첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보

www.acmicpc.net

📌 해결순서

문제에서 요구하는 값이 절단기 높이의 최댓값이므로 조건을 만족하는 절단기의 높이를 작은값부터 최댓값이 될때까지 키워나가면 된다.

절단기의 높이가 높아질수록 상근이가 가져갈수 있는 나무는 적어진다

start = 0 / end = max(lst)

 

1. 절단기의 높이가 너무 짧은 경우

-> 이 경우에는 상근이가 가져가려는 나무의 길이보다 더 많은 나무가 잘리므로 현재 절단기의 높이보다 더 짧은 경우에 대해서 탐색하지 않는다.

따라서, start = mid + 1 로 설정

2. 절단기의 높이가 너무 긴 경우

-> 이 경우에는 상근이가 가져가려는 나무의 길이보다 더 적은 나무가 잘리므로 현재 절단기의 높이보다 더 긴 경우에 대해서 탐색하지 않는다.

따라서, end = mid - 1

📌 코드

import sys
input = sys.stdin.readline

if __name__ == "__main__":
    n, m = map(int, input().split())
    lst = list(map(int, input().split()))

    ans = 0
    start = 0
    end = max(lst)

    while start <= end:
        length = 0
        mid = (start + end) // 2

        for tree in lst:
            if tree > mid:
                length += tree - mid

        if length < m:
            end = mid - 1
        else:
            ans = mid
            start = mid + 1

    print(ans)

 

'algorithm > Binary Search' 카테고리의 다른 글

백준 2792 보석상자  (1) 2022.11.23
백준 6236 용돈 관리  (0) 2022.09.22
백준 3079 입국심사  (0) 2022.09.22
백준 1654 랜선 자르기  (0) 2022.09.22
백준 1920 수 찾기  (0) 2022.09.22