ABC154 D - Dice in Line

備忘録

累積和。。

問題

atcoder.jp

回答

"use strict"
 
function func(val){
  return (1+val)/2;
}
 
function Main(input) {
  input = input.trim().split('\n');
  const N = input[0].trim().split(' ').map(Number)[0];
  const K = input[0].trim().split(' ').map(Number)[1];
  const p = input[1].trim().split(' ').map(Number);
 
  let arr = [0];
  for(let i=0; i<N; i++){
    arr.push(func(p[i]) + arr[i]);
  }
 
  let ret = 0;
  const max = N - K;
  for(let i=0; i<=max; i++){
    let tmp = arr[i+K] - arr[i];
    if(ret < tmp) ret = tmp
  }
  console.log(ret);
}
Main(require("fs").readFileSync("/dev/stdin", "utf8"));

考え方

公式解説のPDFにある通り、各さいころの出目の期待値を順に合計した配列を作り、
作った配列に対して、隣接するK個までの和を求めることで期待値の最大を探索している。

公式の解説だけでは、累積和という言葉が出てきて理解できなかったが、下記の記事が参考になった。

累積和を何も考えずに書けるようにする! - Qiita

ちなみに普通に回答すると、公式にもある通り、LTEになりました。

Submission #10000750 - AtCoder Beginner Contest 154

累積和の解説記事を読めば簡単に解けたので、勉強不足でした。非常に悔しい。。