木を切る
質問する
尚根は木Mメートルが必要です.近くで木を買う場所が壊れてしまったので、政府に伐採許可を申請しました.政府は尚勤があなたの家の近くの木を伐採することを許可し、尚勤は新しく買った木材切断機を使って木を救う.
木材切断機の動作は以下の通りです.まず、尚根はカッターに高さHを指定しなければならない.高さを指定した後、のこぎりは地面からHメートルまで登った.そして、一連の木を切り落とす.そのため、高さがHより大きい木は、H上の部分は切り落とされ、低いものは切り落とされません.例えば、1行連続した木の高さは20,15,10,17である.尚根が高さ15を指定すると、木を切った後の高さは15、15、10、15になりますが、尚根は5インチの木と2インチの木を持って家に帰ります.(合計7メートル)カッターで設定できる高さは正の整数またはゼロです.
尚根は環境に興味があるので、どれだけの木を家に持ち帰るかだけを考えていた.このとき、少なくともmメートルの木を持ち帰るために、カッターが設定できる高さの最値を求めるプログラムを作成してください.
入力
1行目は、木の数Nと、上根が持ち帰ろうとする木の長さMを与える.(1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000)
2行目はツリーの高さを示します.木の高さの和はいつもM以上なので、常根はいつも家に必要な木を持っていくことができます.高さが10000000以下の整数または0.
しゅつりょく
少なくともmメートルの木を家に持ち帰るために、設定可能な高さの最値をカッターに出力します.
入力例1
4 7
20 15 10 17
サンプル出力1
15
入力例2
5 20
4 42 40 26 46
サンプル出力2
36
問題を解く
n,m=map(int,input().split())
tree=list(map(int,input().split()))
left=0
right=max(tree)
answer=0
while left<=right:
ans=0
mid=(left+right)//2
for t in tree:
if t>=mid:
ans+=t-mid
# 이 부분을 넣기 전에는 시간초과가 발생했다.
if ans>m:
break
if ans<m:
right=mid-1
else:
left=mid+1
answer=mid
print(answer)
樹木が全て伐採される場合もあるので、0
から나무의 최대값
の範囲内で、m
の値と等しいかやや大きい値を求める必要がある.木を切る長さがm値に等しいとは限らないから!
樹高から
mid
を引いた値は上根が取れる木の長さであるため,その値が上根が望むm
の値と等しいかどうかを比較し,二分探索を行った.木の高さから
mid
を差し引いた値はm
の値より大きくてもよいが、小さくてはならない.m
より短い木は持って行けません.if문
からm
なら、縛ってください.上記のコード注釈においても、
mid
を基準として切り出すと、上根が取得できる木の長さはm
よりも大きくなる.途中で
break
をしないとタイムアウトが発生します.いずれにしても
m
より長いと、それより小さい値を探索しなければならないので、以降の計算は不要で、時間の無駄になるだけです.最初はこの事実を思いもよらず、二分探索コードを作っただけで、無条件に
m
値が同じ場合にbreak
値を印刷したが、答えが間違っていて、また思い出した.もう一度考えてから答えたほうがいいです.
他人を解く
N, M = map(int, input().split())
tree = list(map(int, input().split()))
start, end = 1, max(tree)
while start <= end:
mid = (start+end) // 2
log = 0
for i in tree:
if i >= mid:
log += i - mid
if log >= M:
start = mid + 1
else:
end = mid - 1
print(end)
タイムアウトが発生したコードと同じように、何が違うのか調べてみました.以上のコードは、
python
を回転するのではなく、Pypy3
を回転するコードです.Pypy3
は初めて聞いたことがありますが、JITコンパイラでpython
よりも早い言語に改良されています.しかし、メモリを使うデメリットも多い.python
が有利、pypy3
が有利であると言われています.Reference
この問題について(木を切る), 我々は、より多くの情報をここで見つけました https://velog.io/@nuri00/나무-자르기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol