2805号:木を切る[python]
先にやりましょう。
n, m = map(int, input().split())
v = sorted(list(map(int, input().split())))
p = n - 1
sum = 0
if len(v) > 1:
for i in range(1, n):
sum += (v[p] - v[p - 1]) * i
if sum >= m:
print(v[p - 1] + (sum - m) // i)
break
p -= 1
if sum == 0: # 예외1. 모든 수가 같은 경우
print(v[p] - m // n)
elif sum < m: # 예외2. sum이 m 보다 낮을 경우
tmp = (m - sum) // n
if (m - sum) % n > 0: # 올림
tmp += 1
print(v[p] - tmp)
elif v[p] == 1: # 예외3. 길이가 1인 나무 밖에 없을 때
print(1)
else: # 예외4. 나무가 1개 밖에 없을 떄
print(v[0] - m)
リストを並べ替えた後、一番長い木から、小さな木の順に並べて、全長を計算します.合計長さがmより大きい場合は、増大した値を通過する木の数で割って、現在の木の長さを加えると終了します.問題の分類はバイナリ探索であり,どのようにバイナリ探索で体現するか分からない.
Reference
この問題について(2805号:木を切る[python]), 我々は、より多くの情報をここで見つけました https://velog.io/@dongkan9/2805번-나무-자르기-Pythonテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol