白俊答題2805木を切る

5242 ワード

boj 2805:木を切る


質問アドレス:https://www.acmicpc.net/problem/2805
難易度:silver 3

1.問題の説明

  • 本の木N本を与えます.
  • 本の木を伐採し、木Mメートルを必要とする.
  • の少なくともmメートルの木の帯を家に帰るために、切断機が設定できる最高の高さは?(高さは整数)
  • 2.問題を解決する考え。

  • ビットの探索によって解決すべきである.
  • のデータ量は非常に大きく、ソートによる解は時間的複雑度
  • を超える.

    3.問題の処理方法

  • 最初はlow=0、high=max(ツリー長リスト)、
  • に設定
  • mid=(low+high)//2で、カッター高さを設定します.
  • 設定する値がM未満の場合
  • high=mid-1制限上限、
  • Mより大きい場合
  • low=mid+1は下限を制限します.
  • その後、正しい答えを更新します.
  • while low <= high:
        total = 0
        mid = (low + high) // 2
        for tree in trees:
            if tree > mid:
                total += tree-mid
        if total < M:
            high = mid - 1
        else:
            ans = mid #밑의 과정을 통해 while문이 끝날수도 있기때문에 업데이트 해준다.
            low = mid + 1

    4.特別注意事項

  • は私たちがデジタルクイズをしているように見えます.
  • 5.コード実装

    N, M = map(int, input().split())
    trees = list(map(int, input().split()))
    
    low = 0
    high = max(trees)
    
    ans = 0
    while low <= high:
        total = 0
        mid = (low + high) // 2
        for tree in trees:
            if tree > mid:
                total += tree-mid
        if total < M:
            high = mid - 1
        else:
            ans = mid
            low = mid + 1
    
    print(ans)