【全探索 1】高い寿司を食いたい! (paizaランク B 相当)
解答例
K枚の寿司の合計を全探索します。
Pの配列、先頭のインデックスをiとして、K枚の合計を求めます。
Pの最後の要素を先頭とするまで、求めていきます。
合計を求めるのに、一回ごとに全て合計していると計算量が増えるので、前の合計金額から、先頭を引いて、末尾を加えれば、計算量が少なくて済みます。
P_1 の寿司と P_N の寿司は隣接しているので、Pの最後の要素を超えたら、最初の要素に戻ります。
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
const [N, K] = lines[0].split(" ").map(Number);
const P = lines.slice(1).map(Number);
//現在の連続する K 枚の寿司の合計金額
let now_price = P.slice(0, K).reduce((a, b) => a + b);//先頭がi=0
//連続する K 枚の寿司の合計金額の最大値
let max_price = now_price;
if (K < N) { //NとKが同じなら必要ない
//連続するK枚の寿司の先頭のインデックスi
for (let i = 1; i < N; i++) {
//前の合計金額から先頭を引く
now_price -= P[i - 1];
//前の合計金額に最後尾を足す
now_price += P[(i + K - 1) % N];//P_1 の寿司と P_N の寿司は隣接
//最大更新
max_price = Math.max(max_price, now_price);
}
}
console.log(max_price);