演習課題「太巻きを分けよう(おなかいっぱい)」
整数l,n,kと長さkの配列aが与えられるので、各iについて左端からa[i]cmのところに切れ目の入った長さlcmの太巻きを切れ目に沿ってn個に切り分けるとき、分けられた太巻きのうち最も長い太巻きの長さの最小値を求めてください。
すでに入力を行うコードが実装されているので、コードを書き足して完成させてください。
期待する出力値
2
#06:最小値の最大化
このチャプターでは、レベルアップ問題集「二分探索メニュー」の「太巻きを分けよう」の問題を解いていきます。
l, n, k = map(int, input().split())
a = [int(x) for x in input().split()]
# 配列(リスト)aの末尾にlを追加
a.append(l)
# 変数left,rightをそれぞれ0とl+1で初期化
left, right = 0, l+1
# leftとrightの差が1でない間
while right - left != 1:
# 変数midに(left+right)/2を代入
mid = (left + right) // 2
# 前回の切れ目の位置を表す変数lastと切り分けた個数を表す変数countを0で初期化
last, count = 0, 0
# iを0からkまで繰り返す
for i in range(k+1):
# もしa[i]-lastがmid以上なら
if a[i] - last >= mid:
# lastにa[i]を代入し、countを1増やす
last = a[i]
count += 1
# もしcountがn以上なら
if count >= n:
# leftをmidで更新
left = mid
# そうでなければ
else:
# rightをmidで更新
right = mid
# leftを出力
print(left)
10 3 3
1 3 8