https://www.acmicpc.net/problem/2805
매개 변수 탐색을 이용해서 문제를 풀 수 있다.
처음은 1~'가장 큰 나무의 높이' 의 중앙을 찾고(mid), 절단기를 mid로 설정했을때 나오는 나무들의 길이가 M보다 크다면 mid를 줄여가면서 M에 맞는 최대값을 찾는 방법으로 문제를 풀 수 있다. 만약 나무들의 길이가 M보다 작다면 mid를 늘려야 한다. 조건에 만족하는 수들 중 가장 큰 값을 찾는 문제이다.
from sys import stdin
input = stdin.readline
def find(array, n):
#초기값을 설정해준다.
start = 1
end = max(array)
while start<=end:
sum = 0
mid = (start+end)//2
for i in array:
if i>mid: #자를 수 있다면
sum+= i- mid #잘라서 sum에 더한다.
if sum>=n:#sum이 조건을 충족한다면
start = mid+1#좀 더 절단기를 높여서 찾아본다.
else:#조건에 충족하지 못하면
end = mid-1#좀 더 절달기를 낮춰서 찾아본다.
#while문을 다 돌고 나면 end는 가장 최적의 값을 가지고 있다.
return end #end가 절단기의 최댓값을 가진다.
n, m = map(int,input().split())
array = list(map(int,input().split()))
print(find(array,m))