ABC154 D - Dice in Line
備忘録
累積和。。
問題
回答
"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
個までの和を求めることで期待値の最大を探索している。
公式の解説だけでは、累積和という言葉が出てきて理解できなかったが、下記の記事が参考になった。
ちなみに普通に回答すると、公式にもある通り、LTEになりました。
Submission #10000750 - AtCoder Beginner Contest 154
累積和の解説記事を読めば簡単に解けたので、勉強不足でした。非常に悔しい。。