编辑代码

// 设置标准输入接口
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

// 问题描述:选择最小成本的任务分配
// 规则:
// 1. 有m天,每天都需要选择一个任务执行
// 2. 每天的任务成本不同
// 3. 不能连续两天选择相同位置的任务
// 目标:求完成所有任务的最小总成本

void (async function () {
  // 读取天数m
  const m = Number(await readline());
  // 记录总成本
  let ans = 0;
  // 记录上一天选择的任务位置
  let last = null;

  // 处理每一天的任务
  for (let i = 0; i < m; i++) {
    // 读取当天每个任务的成本
    const costs = (await readline()).split(" ").map(Number);

    // 第一天的情况:直接选择成本最小的任务
    if (!last) {
      // 找到最小成本并加入总成本
      ans += Math.min(...costs);
      // 记录最小成本任务的位置(如果有多个相同成本,取最后一个)
      last = costs.lastIndexOf(Math.min(...costs));
    }
    // 其他天的情况:不能选择与前一天相同位置的任务
    else {
      // 初始化当前最小成本和对应位置
      let nowVal = Infinity; // 当前找到的最小成本
      let nowIdx = -1; // 当前最小成本的任务位置

      // 遍历所有任务,找到不同位置中成本最小的任务
      costs.forEach((element, idx) => {
        // 如果当前任务成本更小且位置与前一天不同
        if (nowVal > element && idx !== last) {
          nowVal = element; // 更新最小成本
          nowIdx = idx; // 更新任务位置
        }
      });

      // 将找到的最小成本加入总成本
      ans += nowVal;
      // 更新上一次选择的任务位置
      last = nowIdx;
    }
  }

  // 输出最小总成本
  console.log(ans);
})();;