Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
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
Archives
Today
Total
관리 메뉴

Life Engineering

[BOJ 2805] 나무 자르기(Python3) 본문

Problem Solving

[BOJ 2805] 나무 자르기(Python3)

흑개 2021. 2. 19. 17:45

www.acmicpc.net/problem/2805

 

2805번: 나무 자르기

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

www.acmicpc.net

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
N, M=map(int, input().split())
trees=list(map(int, input().split()))
start=1
end=2000000000
result=0
 
while start<=end:
    mid=(start+end)//2
    total=0
    for tree in trees:
        if tree>mid:
            total+=(tree-mid)
    if total>=M:
        result=max(result,mid)
        start=mid+1
    else:
        end=mid-1
 
print(result)
cs

전형적인 이분탐색 문제

이때 최소값을 0, 최댓값을 트리의 최대 길이로 설정해주어도 ok다. (트리의 최대길이를 넘는 것과 트리의 최대 길이가 절단기가 되었을 때 결괏값은 같다.)

 

mid 높이로 잘랐을 때 길이가 M 이상이면 오른쪽을 탐색, M 미만이면 왼쪽을 탐색한다. 

이때 길이가 M 이상일 때 절단기 값을 result값에 넣어 최대값을 만날 때마다 갱신해준다.