问题描述
假如有一群猫排成一行,要分配鱼干,每一只猫都有一个等级值。你作为管理员有很多鱼干但是需要按下边的分配制度分配:
-
每一只猫至少要分配一斤鱼干,鱼干分配最小单位是斤,必须保证是整数。
-
猫比他们邻居有更高等级值的分配的鱼干要多于他们的邻居。
为了满足上边的分配规则,需要得到需要的最少鱼干数量。
输入格式
第 1 行输入猫的数量 N
从第 2 行到第 N + 1 行,输入每一只猫的等级值 D。
输出格式
输出一个整数,表示需要的鱼干数量(斤)
输入样例
3 1 2 2
输出样例
4
数据范围
1 <= N <= 10^3
1 <= D <= 10^6
解题思路
-
至少分配一斤鱼干:每只猫至少分配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();