编辑代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
  // 读取题目时间数组和天数
  const questions = (await readline()).split(",").map(Number);
  const m = Number(await readline());

  // 二分查找的左右边界
  // left: 最小可能时间(0)
  // right: 最大可能时间(所有题目时间总和减去最大题目时间)
  let left = 0;
  let right = questions.reduce((a, b) => a + b) - Math.max(...questions);

  // 检查给定的T是否可行
  const check = (T) => {
    let days = 1; // 当前天数,从第1天开始
    let i = 0; // 当前处理的题目索引
    let maxCost = 0; // 当前天耗时最多的题目
    let sum = 0; // 当前天的做题时间总和
    let canWatch = true; // 当前天是否可以看答案

    // 遍历所有题目
    while (i < questions.length) {
      // 如果加上当前题目会超过时间限制T
      if (sum + questions[i] > T) {
        // 如果当前天还可以看答案
        if (canWatch) {
          // 减去当前天耗时最多的题目,用看答案的方式处理
          sum -= maxCost;
          canWatch = false; // 当前天不能再看答案
          // 加入当前题目
          sum += questions[i];
          i++;
        } else {
          // 如果当前天不能看答案,开始新的一天
          sum = 0;
          maxCost = 0;
          canWatch = true; // 新的一天可以看答案
          days++;
        }
      } else {
        // 如果加上当前题目不会超过时间限制,直接加入
        sum += questions[i];
        maxCost = Math.max(maxCost, questions[i]); // 更新当前天耗时最多的题目
        i++;
      }
    }

    // 判断是否在m天内完成所有题目
    return days <= m;
  };

  // 二分查找最小可行时间T
  while (left < right) {
    const mid = (left + right) >> 1; // 使用位运算计算中间值
    if (check(mid)) {
      // 如果mid可行,尝试更小的时间
      right = mid - 1;
    } else {
      // 如果mid不可行,尝试更大的时间
      left = mid + 1;
    }
  }

  // 输出最小可行时间
  console.log(left);
})();