paizaの森練習問題コンテスト過去問題9

paizaの森練習問題コンテスト(2023年4月開催)の過去問です。

【最大値と最小値】コード

reader.on('close', () => {
   const [a, b, c] = lines[0].split(' ').map(Number);
   console.log(Math.min(a, b, c), Math.max(a, b, c));
});
hogeちゃんの画像

Math.min() で最小値。Math.max() で最大値。

【卵の生産】コード

reader.on('close', () => {
   const [a, n] = lines[0].split(' ');
   console.log(a * n);
});
hogeちゃんの画像

a 個 ✕n 日 なので a * n

【卵の最大の生産量】コード

reader.on('close', () => {
   const [n, k] = lines[0].split(' ').map(Number);
   const A = lines[1].split(' ').map(Number);
   const S = [0];  // A の累積和
   for (let i = 0; i < n; i++) {
      S.push(S[i] + A[i]);  // A の累積和を S に保存
   }
   let ans = 0;
   for (let i = k; i < n; i++) {
      const eggs = S[i] - S[i - k];  // eggsi - k + 1 日目 ~ i 日目に産んだ数
      if (eggs  > ans) {  // eggsans より多ければ…
         ans = eggs;  // ans を上書き
      }
   }
   console.log(ans);
});
hogeちゃんの画像

累積和を使っています。

【卵の最大の生産量 – その 2】コード

reader.on('close', () => {
   const [n, k] = lines[0].split(' ').map(Number);
   const A = lines[1].split(' ').map(Number);
   const S = [0];  // A の累積和
   for (let i = 0; i < n; i++) {
      S.push(S[i] + A[i]);  // A の累積和を S に保存
   }
   let ans = 0;
   for (let i = k; i < n; i++) {
      const eggs = S[i] - S[i - k];  // eggsi - k + 1 日目 ~ i 日目に産んだ数
      if (eggs  > ans) {  // eggsans より多ければ…
         ans = eggs;  // ans を上書き
      }
   }
   console.log(ans);
});
hogeちゃんの画像
その1と同じ…。(^_^;)

【卵をぴったり生産】コード

reader.on('close', () => {
   const hen = lines[1].split(' ').map(Number);
   const [n, k] = lines[0].split(' ').map(Number);
   const dp = [1];  // index個にする方法のパターン数を保存する配列
   for (let i = 1; i <= k; i++) {
      dp.push(0);  // パターン数を0で初期化
   }
   for (let i = 0; i < n; i++) {
      for (let j = k; j >= hen[i]; j--) {
         dp[j] += dp[j - hen[i]];
  // j 個にするパターン数にj-hen[i]グラムにするパターン数を加算
      }
   }
   console.log(dp[k]);
});
hogeちゃんの画像

DPメニュー【部分和問題 1 〜 4 】のコードを応用しました。

【卵をぴったり生産】!失敗 《54点》

reader.on('close', () => {
   function perfect_production(arr, n, k) {
      const combination = [];
      if (n === 1) {
         for (let i = 0; i < arr.length; i++) {
            combination[i] = [arr[i]];
         }
      } else {
         for (let i = 0; i < arr.length - n + 1; i++) {
            let row = perfect_production(arr.slice(i + 1), n - 1);
            for (let j = 0; j < row.length; j++) {
               combination.push([arr[i]].concat(row[j]));
            }
         }
      }
      return combination;
   }
   let ans = 0;
   const [N, K] = lines[0].split(' ').map(Number);
   const hen = lines[1].split(' ').map(Number);
   for (let i = 1; i <= N; i++) {
      const eggs = perfect_production(hen, i, K);
      for (let j = 0; j < eggs.length; j++) {
         if (eggs[j].reduce((a, c) => a + c) === K) {
            ans++;
         }
      }
   }
   console.log(ans);
});
hogeちゃんの画像

100点にならなかったけど 一応残しておきます。

コメント