累積和メニュー【区間内の個数 1 〜 4】
【区間内の個数 1】コード
const a = [1, 5, 9, 7, 5, 3, 2, 5, 8, 4];
const b = new Array(10); // 10 = a の要素数
const s = [0]; // b の 累積和
for (let i = 0; i < 10; i++) {
a[i] % 2 === 0 ? b[i] = 1 : b[i] = 0; // a[i]が偶数→b[i] = 1,奇数→b[i] = 0
s.push(s[i] + b[i]); // s[i + 1] = s[i] + b[i]
}
// b = [0, 0, 0, 0, 0, 0, 1, 0, 1, 1]
// s = [0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3]
console.log(s[8] - s[2]); // 範囲の右端 - 左端の直左 を出力
a[i] が 偶数 なら b[i] は1 。奇数なら b[i] は0。s に b の累積和を保存。s[8] から s[2] を減算すれば 答えが得られました。詳しくは 問題文の(ヒント) をご参照下さい。
【区間内の個数 2】コード
reader.on('close', () => {
const a = lines[0].split(' ').map(Number);
const b = new Array(10); // 10 = a の要素数
const s = [0]; // b の 累積和
for (let i = 0; i < 10; i++) {
a[i] % 2 === 0 ? b[i] = 1 : b[i] = 0; // a[i]が偶数→b[i] = 1,奇数→b[i] = 0
s.push(s[i] + b[i]); // s[i + 1] = s[i] + b[i]
}
console.log(s[8] - s[2]); // 範囲の右端 - 左端の直左 を出力
});
配列 a の値を標準入力から受け取っていますが それ以外は【STEP: 1】と同じです。
【区間内の個数 3】コード
reader.on('close', () => {
const [X, Y] = lines[0].split(' ').map(Number);
const a = lines[1].split(' ').map(Number);
const b = new Array(10); // 10 = a の要素数
const s = [0]; // b の 累積和
for (let i = 0; i < 10; i++) {
a[i] % 2 === 0 ? b[i] = 1 : b[i] = 0; // a[i]が偶数→b[i] = 1,奇数→b[i] = 0
s.push(s[i] + b[i]); // s[i + 1] = s[i] + b[i]
}
console.log(s[Y + 1] - s[X]); // 範囲の右端 - 左端の直左 を出力
});
含まれる偶数の数を調べる区間が a[X] 〜 a[Y] に指定されました。それ以外は【STEP: 2】と同じです。
【区間内の個数 4】コード
reader.on('close', () => {
const [N, X, Y] = lines[0].split(' ').map(Number);
const a = lines[1].split(' ').map(Number);
const b = new Array(N); // N = a の要素数
const s = [0]; // b の 累積和
for (let i = 0; i < N; i++) {
a[i] % 2 === 0 ? b[i] = 1 : b[i] = 0; // a[i]が偶数→b[i] = 1,奇数→b[i] = 0
s.push(s[i] + b[i]); // s[i + 1] = s[i] + b[i]
}
console.log(s[Y + 1] - s[X]); // 範囲の右端 - 左端の直左 を出力
});
配列 a の要素数が N 個になりましたが それ以外は【STEP: 3】と同じです。
コメント