M, M = map(int, input().split())
heights = list(map(int, input().split()))

min_height, max_height = 1, max(heights)
H = 0

while(min_height <= max_height):
    mean_height = (min_height + max_height) // 2
    
    cut_num = 0
    for height in heights:
        if(height > mean_height):
            cut_num += (height - mean_height)
            
    # 가져가려고 하느 나무의 길이를 충족했다면,
    # 나무를 아끼기 위해 한번 더 조사한다.
    if(cut_num >= M):
        H = mean_height
        min_height = mean_height + 1
        
    # 가져가려고 하는 나무의 길이를 충족하지 못한다면,
    # 최대 길이를 낮춘다.
    elif(cut_num < M):
        max_height = mean_height - 1
        
print(H)

pypy3로 제출하여 통과하였음. 랜선 자르기를 풀었다면, 쉽게 풀 수 있음.

'# 코딩 문제 관련 > 파이썬' 카테고리의 다른 글

백준 7576번(python)  (0) 2020.08.02
백준 2606번(python)  (0) 2020.08.01
백준 1654번(python)  (0) 2020.07.27
백준 10816번(python)  (0) 2020.07.19
백준 1920번(python)  (0) 2020.07.19