1. paizaラーニングトップ
  2. レベルアップ問題集
  3. スタック・キューメニュー(言語選択)
  4. 問題一覧 Objective-C編
  5. 最大の区間和 Objective-C編

スタック・キューメニューのサムネイル
最大の区間和 Objective-C編(paizaランク B 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

N 個の要素からなる数列 A があります。 A に含まれる連続した X 個の要素の和の最大値とその区間の左端の値を出力してください。ただし、要素の和の最大となる区間が複数ある場合はそのうちもっとも先頭の値を出力してください。
たとえば、 N = 4 , A = [2, 3, 4, 1] , X = 2 とします。連続した 2 個の要素の和が最大となる区間は A の 2 番目から 3 番目まで( 3 + 4 = 7 が最大値 )なので、最大値 7 とその区間の左端の値 3 を出力します。

また、実行時間に注意しましょう。たとえば以下の Python3 のプログラムのような、数列の要素数 N と和を求める連続する要素数 X を用いて、約 N * X 回足し算をおこなうプログラムはタイムオーバーになってしまうことがあります。キューまたはスタックを用いて効率のよいプログラムを意識しましょう。

# Python3 のタイムオーバーとなるプログラム例
n, x = map(int, input().split())
a = list(map(int, input().split()))

left_num = -1
max_sum = 0

for i in range(n - x + 1):
sum_a = 0
for j in range(x):
sum_a += a[i + j]
if sum_a > max_sum:
left_num = a[i]
max_sum = sum_a

print(max_sum, left_num)

入力される値

N X
A_1 A_2 ... A_N


入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力

X 個の要素の和の最大値 M とその区間の左端の値 L を半角スペース区切りで出力してください。要素の和の最大となる区間が複数ある場合はそのうちもっとも先頭の値を出力してください。

M L


末尾には改行を入れ、余計な文字、空行を含んではいけません。

条件

すべてのテストケースにおいて、以下の条件をみたします。

・ N は 1 以上 500,000 未満
・ X は 1 以上 N 以下
・ A_i は 1 以上 100 未満

入力例1

4 2
2 3 4 1

出力例1

7 3

入力例2

5 5
1 2 3 4 5

出力例2

15 1

問題一覧へ戻る

ページの先頭へ戻る