1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

特殊な2項間漸化式 2

Posted at

今回は paiza の「特殊な2項間漸化式 2」の問題に挑戦!

前々回と前回の問題を組み合わせて解く感じで復習ができた!


問題概要

  • 与えられるもの:

    • 初項 x と、奇数番目の加算量 d1、偶数番目の加算量 d2
      クエリ数 Q
    • Q 個の整数 k1, k2, ..., kQ(数列の何番目の値を求めるか)

  • 求めるもの:

    • 数列 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から始める




僕の失敗談(´;ω;`)と解決法🐈

1
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?