/**
 * @param {number[]} nums
 * @param {number[]} cost
 * @return {number}
 */
const minCost = (nums, cost) => {
  let combined = nums.map((value, index) => ({ value, index }));
  combined.sort((a, b) => a.value - b.value);
  let sortedNums = combined.map(({ value }) => value);
  let sortedCost = combined.map(({ index }) => cost[index]);

  let min = 0, prefixCost = Array.from({ length: nums.length }, () => 0);
  prefixCost[0] = sortedCost[0];

  for (let i = 1; i < sortedNums.length; i++) {
    min += (sortedNums[i] - sortedNums[0]) * sortedCost[i];
  }

  for (let i = 1; i < sortedNums.length; i++) {
    prefixCost[i] = prefixCost[i - 1] + sortedCost[i];
  }

  let tmpMin = min;
  for (let i = 1; i < sortedNums.length; i++) {
    let gap = sortedNums[i] - sortedNums[i - 1];

    tmpMin += prefixCost[i - 1] * gap;
    tmpMin -= (prefixCost[nums.length - 1] - prefixCost[i - 1]) * gap;

    min = Math.min(min, tmpMin);
  }

  return min;
};