1
2

More than 1 year has passed since last update.

paizaラーニング レベルアップ問題集 新・Bランクレベルアップメニュー JavaScript【全探索 1】高い寿司を食いたい!

Posted at

【全探索 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);
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2