## 풀이
처음에는 맨 위에서부터 자르고, 잘라서 나온값을 더해서 그 높이에서 얻을수 있는 나무의 값들을 더하면 된다고 생각했다.
아래 코드 lambda x : x-k 부분이 나무를 자르는 부분인데, 그 뒤에 그냥 더해버리면 음수가 나오므로 0보다 작은 값은 0으로 만들고 더했다. (그 아래 for문)
적어도 M미터를 가져가면 되므로 출력은 for문에서 원하는 높이보다 크거나 같은 시점이 나올때, 잘랐던 높이를 출력하도록 했었는데...


## 코드
N,M = map(int,input().split())
l = list(map(int,input().split()))
h = 0

ans = []
height_l = []
for k in range(max(l),-1,-1):
    get = list(map(lambda x:x-k, l))
    for i in range(len(get)):
        if get[i] < 0:
            get[i] = 0
    ans += [sum(get)]
    height_l +=[k]

for k in range(len(ans)):
    if ans[k] >= M:
        print(height_l[k])
        break

이렇게 짜면 시간초과가 된다


N, M = map(int, input().split())
l = list(map(int, input().split()))

# 최대 높이 구하기
max_height = max(l)

result = 0

# 이진 탐색
min_height = 0
while min_height <= max_height:
    mid_height = (min_height + max_height) // 2  
   
    total_cut = sum(max(0, x - mid_height) for x in l)  
   
    if total_cut >= M:
        result = mid_height
        min_height = mid_height + 1

    else:
        max_height = mid_height - 1

print(result)
결과 자체는 문제가 없다고 생각했는데
솔직하게 말하면 내 힘으로 문제를 해결하지는 못했고

처음 자르는 높이를 중간으로 잡고, 이진탐색으로 찾아나가서 O(logn) 시간에 해결할수 있다.
자른 높이를 더하기 전에 0보다 작은값 걸러내는것도 max 함수를 이용하면 for문이 필요가 없다.
리스트 2개에 저장할 필요도 없다.

쉬운문제만 너무 많이 풀었나?