[白俊2805]木を切る(Python)


1.アイデア


問題では、少なくともMメートルの木がほしいと思っています.切断機で設定した最高の高さです.したがって,二分探索で見つける値はカッターの高さである.カッターの高さは少なくとも1から設定できるので、左側は1に設定します.また、rightは、与えられたツリーの中で最も高い高さに設定されています.その後,各木の高さをmid(カッターの高さ)差減し,結果を統計した.確認合計結果はM以上で最大値となります.
伐採後に得られる木の高さがM以上であれば、伐採機の高さが低く、伐採回数が多く、伐採機の高さが向上することを意味する.(i.e.24579142)逆に、伐採された木の高さがleft = mid + 1を下回ると、伐採機の高さが高すぎることを意味し、伐採回数が少ないため、伐採機の高さが低下する.(i.e. M )

2.コード

import sys

n, m = map(int, sys.stdin.readline().rsplit())
trees = list(map(int, sys.stdin.readline().rsplit()))
left, right = 1, max(trees)
answer = 0
while left <= right:
    mid = (left + right) // 2
    total = 0
    for tree in trees:
        remain = tree - mid
        if remain > 0: total += remain

    if total >= m:
        left = mid + 1
        answer = max(answer, mid)

    else: right = mid - 1

print(answer)