損益の 合計が 最も 大きい連続した期間
- 配列の処理
- 問題 13
- ふつう
- 目安 31 分
店の
本番の
入力は
問題
ある
期間は
入力の形式
N
a_1 a_2 ... a_N1 行目に
出力の形式
合計の
制約
- N は 1 以上 200000 以下です
- a_i は -1000000000 以上 1000000000 以下の整数です
入力と出力の例
例 1
3 日目から
入力
8 -2 1 -3 4 -1 2 1 -5
出力
6
例 2
全部の
入力
3 -3 -1 -2
出力
-1
ヒント
まだ開いていません
付箋は 3 枚。下の段ほど答えに近づきます
ヒント 2
ヒント 3答えに近い
全部の
先に
解答
前から 1
Python
Python
import sys
data = sys.stdin.read().split()
n = int(data[0])
profits = list(map(int, data[1:1 + n]))
best = profits[0]
current = profits[0]
for a in profits[1:]:
current = current + a if current > 0 else a
if current > best:
best = current
print(best)JavaScript
JavaScript
const data = require("fs").readFileSync(0, "utf8").split(/\s+/).filter(Boolean).map(Number);
const n = data[0];
const profits = data.slice(1, 1 + n);
let best = profits[0];
let current = profits[0];
for (let i = 1; i < n; i++) {
const a = profits[i];
current = current > 0 ? current + a : a;
if (current > best) best = current;
}
console.log(String(best));計算量
時間は O(N) です。
よく ある間違い
- 全部の
日が 赤字の ときに 0 を 出す。 最大の 初めの 値を 0 に すると 起きます。 1 日目の 損益から始めます - 合計が
いちばん 大きい期間を 探すのに、 黒字の 日だけを 足してしまう。 間に 赤字の 日を 挟んでも、 前後の 黒字が 大きければ 続けた ほうが 合計は 大きくなります - 合計が
大きくなる ことを 考えない。 20 万日が どれも 10 億なら合計は 200 兆です。 Python と JavaScript の 数なら そのまま 扱えますが、 ほかの 言語で 32 ビットの 整数を 使うと あふれます
解答を動かした版 Python 3.12.14Node.js 22.23.4確認日 2026/10/31