[boj] 2343. その他のレッスン(node.js)


問題の概要


[boj] 2343. その他のレッスン(node.js)
  • 所与の大きさNの配列を順にM個のグループに分けた.
  • すべてのグループのサイズが同じである場合、グループの最小サイズを求める問題.
  • に答える

  • 最小サイズを二分探索により探索した.
  • グループの最小サイズは、アレイ内の最大要素のサイズから始まります.
  • 最小サイズ
  • が分かれば、そのサイズでグループ化された個数を求めることができる.これを条件として二分探索の2つのポインタL,Rを移動し,答えを求める.
  • 説明する

    const readline = require("readline");
    const rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout,
    });
    
    function solution() {
      const [N, M] = input().split(" ").map(Number);
      const arr = input().split(" ").map(Number);
      let max = Math.max(...arr);
      let L = max;
      let R = 1000000000;
      let result = R;
      while (L <= R) {
        let mid = Math.floor((L + R) / 2);
        if (groupCounter(mid) > M) {
          L = mid + 1;
        } else {
          result = mid;
          R = mid - 1;
        }
      }
      console.log(result);
    
      function groupCounter(max) {
        let cnt = 0;
        let sum = 0;
        for (let i = 0; i < N; i++) {
          if (sum + arr[i] > max) {
            sum = 0;
            cnt++;
          }
          sum += arr[i];
        }
        return ++cnt;
      }
    }
    
    let cnt = 0;
    const input = () => stdin[cnt++];
    
    let stdin = [];
    rl.on("line", function (line) {
      stdin.push(line);
    }).on("close", function () {
      solution();
      process.exit();
    });