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

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

【文字数カウント】コード

reader.on('close', () => {
   const m = lines[0];
   console.log(m.length);  // m の文字数を出力
});
hogeちゃんの画像

m.length で m の 文字数が取得できました。

【乗客人数】コード

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

足し算と引き算は数学記号と同じ…。

【OPS】コード

reader.on('close', () => {
   const [b, s] = lines[0].split(' ').map(e => e * 1000);
  // ① 入力値を半角スペース区切りの配列に変換 ② 各値✕1000で小数点なしの値に変換
   console.log((b + s) / 1000);
});
hogeちゃんの画像

小数をそのまま演算すると 丸め誤差が発生するので map(e => e * 1000) で [b,s] を 各々1000 倍して から足し合わせています。

【通貨レート】コード

reader.on('close', () => {
   const n = Number(lines[0]);
   const M = [];  // [日, 為替レート] を保存(2次元配列)
   for (let i = 1; i <= n; i++) {
      const m = Number(lines[i]);  // i 日目の為替レート
      M.push([i, m]);  // [i, m] = [i 日, i 日の為替レート]
   }
   const S = [];  // [1回目の換金日,2回目換金日,2回目のレート-1回目のレート]
   for (let i = 0; i < n -1; i++) {  // M[i] (1回目の換金)
      for (let j = n - 1; j > i; j--) {  // M[j] (2回目の換金)
          S.push([M[i][0], M[j][0], M[j][1] - M[i][1]]);
  // S に 各 [1回目の換金日,2回目換金日,2回目のレート-1回目のレート]を保存
      }
   }
   S.sort((s, b) => s[2] - b[2]);  // 2回目のレート-1回目のレート が小さい順に並べ替え
   if (S[S.length - 1][2] > 0) {  // S[S.length - 1][2] が 0 より大きければ
      console.log(S[S.length - 1][0]);  // 1回目の換金日を出力
      console.log(S[S.length - 1][1]);  // 2回目の換金日を出力
   } else {  // 0以下なら
      console.log('No');  // Noを出力
   }
});
hogeちゃんの画像
答えが複数ある場合は換金日が早い方の日付にしないとダメみたいね。

【乗客人数 – その 2】コード

reader.on('close', () => {
   const n = Number(lines[0]);
   const a = lines[1].split(' ').map(Number);
   const b = lines[2].split(' ').map(Number);
   const a_s = [0];
   const b_s = [0];
   const c = [];
   for (let i = 0; i < n; i++) {
      a_s.push(a_s[i] + a[i]);
      b_s.push(b_s[i] + b[i]);
      c.push(b_s[i + 1] - a_s[i + 1]);
   }
   console.log(Math.max(...c));
});
hogeちゃんの画像

とりあえずup。

【OPS – その 2】コード

reader.on('close', () => {
   const n = Number(lines[0]);
   let OPS = 0;
   let ans = 0;
   for (let i = 1; i <= n; i++) {
      const [b, s] = lines[i].split(' ').map(e => e * 1000);
      const ops = b + s;
      if (ops > OPS) {
         OPS = ops;
         ans = i;
      }
   }
   console.log(ans);
});
hogeちゃんの画像

とりあえずup。

【タスクスケジューリング】コード

reader.on('close', () => {
   const n = Number(lines[0]);
   const ST = [];
   for (let i = 1; i <= n; i++) {
      const [s, t] = lines[i].split(' ').map(Number);
      ST.push([s, t]);
   }
   ST.sort((s, b) => s[1] - b[1]);
   let end = ST[0][1];
   let ans = 1;
   // console.log(end);
   for (let i = 1; i < n; i++) {
      if (end < ST[i][0]) {
      end = ST[i][1];
      ans++;
      }
   }
  // console.log(end);
   console.log(ans);
});
hogeちゃんの画像

とりあえずup。

コメント