[白俊]#2805


#2805


ビューを展開
PROBLEM
尚根は木Mメートルが必要です.近くで木を買う場所が壊れてしまったので、政府に伐採許可を申請しました.政府は尚勤があなたの家の近くの木を伐採することを許可し、尚勤は新しく買った木材切断機を使って木を救う.
木材切断機の動作は以下の通りです.まず、尚根はカッターに高さHを指定しなければならない.高さを指定した後、のこぎりは地面からHメートルまで登った.そして、一連の木を切り落とす.そのため、高さがHより大きい木は、H上の部分は切り落とされ、低いものは切り落とされません.例えば、1行連続した木の高さは20,15,10,17である.尚根が高さ15を指定すると、木を切った後の高さは15、15、10、15になりますが、尚根は5インチの木と2インチの木を持って家に帰ります.(合計7メートル)カッターで設定できる高さは正の整数またはゼロです.
尚根は環境に興味があるので、どれだけの木を家に持ち帰るかだけを考えていた.このとき、少なくともmメートルの木を持ち帰るために、カッターが設定できる高さの最値を求めるプログラムを作成してください.
INPUT:最初の行は、木の数Nと、上から持ち帰ろうとする木の長さMを与える.(1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000)
2行目はツリーの高さを示します.木の高さの和はいつもM以上なので、常根はいつも家に必要な木を持っていくことができます.高さが10000000以下の整数または0.
OUTPUT:少なくともmメートルの木を家に持ち帰るために、カッターが設定できる高さの最低点を出力します.
EXAMPLE 1
input
4 7
20 15 10 17
output
15
EXAMPLE 2
input
5 20
4 42 40 26 46
output
36
RESULT
結果メモリ時間言語コード長エラーpython 527 Bエラーpython 701 B
import sys

num_trees, needs = map(int, sys.stdin.readline().split(" "))
height_tree = list(map(int, sys.stdin.readline().split(" ")))
height_tree.sort(reverse=True)
stacked_tree = 0
need_tree = 0
for i in range(num_trees):
    if i == num_trees - 1:
        add_tree = (needs - stacked_tree)//(num_trees-1)
        need_tree = height_tree[-1] - add_tree
        break
    stacked_tree += (height_tree[i] - height_tree[i + 1]) * (i + 1)
    if stacked_tree == needs:
        need_tree = height_tree[i + 1]
        break
    elif stacked_tree < needs:
        continue
    elif stacked_tree > needs:
        need_tree = height_tree[i + 1]+((stacked_tree - needs)//(i+1))
        break

print(need_tree)