编辑代码

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

void (async function () {
  // 读取输入参数
  const n = Number(await readline()); // 树木的总数量
  const trees = (await readline()).split(" ").map(Number); // 树木的位置数组
  const treeNum = Number(await readline()); // 需要保留的树木数量

  // 二分查找的左右边界
  let left = 1; // 最小可能距离(相邻树木之间的最小距离)
  let right = trees[trees.length - 1] - trees[0]; // 最大可能距离(第一棵和最后一棵树之间的距离)

  /**
   * 检查给定的距离mid是否可行
   * @param {number} mid - 待检查的距离
   * @returns {boolean} - 是否可以在该距离下保留足够数量的树木
   */
  const canCut = (mid) => {
    let count = 1; // 已保留的树木数量,初始为1(第一棵树)
    let last = 0; // 上一棵保留的树木的位置索引

    // 遍历所有树木(从第二棵开始)
    for (let i = 1; i < n; i++) {
      // 如果当前树与上一棵保留的树之间的距离大于等于mid
      if (trees[i] - trees[last] >= mid) {
        count++; // 保留当前树
        last = i; // 更新上一棵保留的树的位置
      }
    }

    // 判断保留的树木数量是否满足要求
    return count >= treeNum;
  };

  // 二分查找最大可行距离
  while (left < right) {
    const mid = (left + right) >> 1; // 使用位运算计算中间值,等同于 Math.floor((left + right) / 2)

    if (canCut(mid)) {
      // 如果mid可行,尝试更大的距离
      left = mid;
    } else {
      // 如果mid不可行,尝试更小的距离
      right = mid - 1;
    }
  }

  // 输出最大可行距离
  console.log(left);
})();