演習課題「しゃくとり法の応用」
整数n,kと昇順にソートされた長さnの配列aが与えられます。
各i=0,1,...,n-1について、aに含まれる、値がa[i]+k以下の要素数を改行区切りで出力してください。
入力を受け取るコードがすでに用意されているので、コードを書き足してプログラムを完成させてください。
期待する出力値
3
4
5
5
5
#09:区間の長さ
このチャプターでは、レベルアップ問題集「累積和メニュー」の「区間の長さ 4」の問題を解いてみます。
半開区間[l,r)(l以上r未満の区間)の長さはl,l+1,...,r-1の個数に等しく、r-lになります。
n, k = map(int, input().split())
a = [int(x) for x in input().split()]
# 現在の右端を表す変数r,現在の総和を表す変数sum_value,答えを表す変数lengthを0で初期化
r, sum_value, length = 0, 0, 0
# 左端lを0からn-1まで繰り返す
for l in range(n):
# rがnより小さく、sum_valueにa[r]を加えてもkを超えない間
while r < n and sum_value+a[r] <= k:
# sum_valueにa[r]を加えて右端rを1ずつ増やす
sum_value += a[r]
r += 1
# もしr-lがlengthよりも大きければ
if r-l > length:
# lengthをr-lで更新
length = r - l
# もしlがrと同じなら
if l == r:
# rを1増やす
r += 1
# そうでなければ
else:
# sum_valueからa[l]を引く
sum_value -= a[l]
# lengthを出力
print(length)
5 3
8 1 1 1 3