今回は paiza の「特殊な2項間漸化式 2」の問題に挑戦!
前々回と前回の問題を組み合わせて解く感じで復習ができた!
問題概要
-
与えられるもの:
- 初項 x と、奇数番目の加算量 d1、偶数番目の加算量 d2
クエリ数 Q - Q 個の整数 k1, k2, ..., kQ(数列の何番目の値を求めるか)
- 初項 x と、奇数番目の加算量 d1、偶数番目の加算量 d2
-
求めるもの:
- 数列 a の各 k_i 番目の値を出力する
- 数列の定義:
a[1] = x
a[n] = a[n-1] + d1(nが奇数で n ≥ 3)
a[n] = a[n-1] + d2(nが偶数)
- 条件
・ -1,000 ≦ x ≦ 1,000
・ -1,000 ≦ d_1 ≦ 1,000
・ -1,000 ≦ d_2 ≦ 1,000
・ 1 ≦ Q ≦ 1,000
・ 1 ≦ k_i ≦ 1,000 (1 ≦ i ≦ Q)
入力例:
3 7 -4
5
1
2
3
4
10
出力例:
3
-1
6
2
11
✅OK例:
const rl = require('readline').createInterface({ input:process.stdin });
const lines = [];
rl.on('line', (input) => lines.push(input));
rl.on('close', () => {
const [x, d1, d2] = lines[0].split(' ').map(Number);
const Q = Number(lines[1]);
const queries = lines.slice(2).map(Number);
const a = [];
a[1] = x;
for(let i = 2; i <= 1001; i++){
if (i % 2 !== 0) {
a[i] = a[i-1] + d1;
}
else if (i % 2 === 0) {
a[i] = a[i-1] + d2;
}
}
for(const k of queries){
console.log(a[k]);
}
});
ちょっと短くしてみる:
for(let i = 2; i <= 1001; i++){
a[i] = a[i-1] + (i % 2 !== 0 ? d1 : d2);
}
🎯 学習のポイント
- 前計算(事前に配列に値を全部入れておく)という考え方
- 最大でも 1000 項までしか求めないので、先に全部求めておける(先に求めておかないと解けないかも)
- 奇数と偶数で処理が分かれる分岐の書き方(
if (i % 2 !== 0)
など) - 1-indexed(1から始まる配列)に注意:
a[1] = x
からスタートするため、添字を1
から始める