?백준 2805 나무 자르기 풀었습니다.
adj는 나무 길이 입력 받은 겁니다.
for (int i = 0; i < n; i++)
{
long length = Integer.parseInt(st.nextToken());
adj.add(length);
hi = Math.max(hi, length) + 1;
}
while (lo + 1 < hi)
{
mid = (lo + hi) / 2;
long get = 0;
for (int i = 0; i < n; i++)
{
if (adj.get(i) > mid)
get += adj.get(i) - mid;
}
if (get >= m)
lo = mid;
else if (get < m)
hi = mid;
}
이분 탐색 부분을 이렇게 짠다고 할 때,
lo=0, hi= max + 1 범위로 해야 되는 거 아닌가요?
hi에 +1 안해주면 lo가 최대 길이로 정답일 때, lo+1<hi 조건 때문에 반환 못하기 때문에 +1 해줘야 한다고 생각했는데,
hi=max로 코드 제출해도 정답이네요.
어떤 부분을 잘못 생각했을까요?
max높이로 딱 자르면 어차피 얻은 나무 합 0아닌가?? max+1로 해도 허공에다가 칼질하는거고 max로 칼질해도 꼭대기 쓰다듬기만 하는거니까