每日一练-鱼猫分干

200 阅读2分钟

问题描述

假如有一群猫排成一行,要分配鱼干,每一只猫都有一个等级值。你作为管理员有很多鱼干但是需要按下边的分配制度分配:

  1. 每一只猫至少要分配一斤鱼干,鱼干分配最小单位是斤,必须保证是整数。

  2. 猫比他们邻居有更高等级值的分配的鱼干要多于他们的邻居。

为了满足上边的分配规则,需要得到需要的最少鱼干数量。

输入格式

第 1 行输入猫的数量 N

从第 2 行到第 N + 1 行,输入每一只猫的等级值 D

输出格式

输出一个整数,表示需要的鱼干数量(斤)

输入样例

3 1 2 2

输出样例

4

数据范围

1 <= N <= 10^3

1 <= D <= 10^6

解题思路

  1. 至少分配一斤鱼干:每只猫至少分配1斤,这是基本规则。

  2. 满足等级差异的条件

    • 如果某只猫的等级比左边邻居的等级高,它必须比左边的猫分到更多的鱼干。
    • 如果某只猫的等级比右边邻居的等级高,它也必须比右边的猫分到更多的鱼干。

要做到这点,我们可以用两次遍历来保证:

  • 第一次从左到右遍历:确保每只猫的鱼干分配满足它比左邻居等级高时分配更多鱼干。
  • 第二次从右到左遍历:确保每只猫的鱼干分配满足它比右邻居等级高时分配更多鱼干。
  1. 总结所需鱼干总量:在两次遍历中,更新每只猫的鱼干分配后,最终求出总的鱼干数量。

题解:

function minFish(N, levels) {
  // 初始化一个数组来存储每只猫的鱼干数量,默认每只猫至少分配1斤
  const fish = new Array(N).fill(1);
  
  // 第一次遍历:从左到右
  for (let i = 1; i < N; i++) {
      if (levels[i] > levels[i - 1]) {
          fish[i] = fish[i - 1] + 1; // 如果当前猫的等级比左边高,鱼干增加
      }
  }

  // 第二次遍历:从右到左
  for (let i = N - 2; i >= 0; i--) {
      if (levels[i] > levels[i + 1]) {
          fish[i] = Math.max(fish[i], fish[i + 1] + 1); // 确保比右边高时,鱼干更多
      }
  }

  // 计算最少需要的鱼干数量
  const totalFish = fish.reduce((sum, num) => sum + num, 0);
  return totalFish;
}




function main() {
  // You can add more test cases here
  const catsLevels1 = [1, 2, 2];
  const catsLevels2 = [6, 5, 4, 3, 2, 16];
  const catsLevels3 = [1, 2, 2, 3, 3, 20, 1, 2, 3, 3, 2, 1, 5, 6, 6, 5, 5, 7, 7, 4];
  console.log(minFish(3, catsLevels1) === 4);
  console.log(minFish(6, catsLevels2) === 17);
  console.log(minFish(20, catsLevels3) === 35);
}

main();

20240926144900.jpg