目录
- 一、题目描述
- 游戏规则如下:
- 限制规则一:
- 限制规则二:
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、JavaScript算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
某部门开展 Family Day 开放日活动,其中有个从桶里取球的游戏。
游戏规则如下:
有 N 个容量一样的小桶等距排开,且每个小桶都默认装了数量不等的小球,每个小桶装的小球数量记录在数组 bucketBallNums 中。
游戏开始时,要求所有桶的小球总数不能超过 SUM,如果小球总数超过 SUM,则需对所有的小桶统一设置一个容量最大值 maxCapacity 并需将超过容量最大值的小球拿出来,直至小桶里的小球数量小于 maxCapacity。
请您根据输入的数据,计算从每个小桶里拿出的小球数量。
限制规则一:
所有小桶的小球总和小于 SUM,则无需设置容量值 maxCapacity,并且无需从小桶中拿球出来,返回结果[]。
限制规则二:
如果所有小桶的小球总和大于 SUM,则需设置容量最大值 maxCapacity,并且需以小中拿球出来,返回从每小出的小球教量组成的数组。
二、输入描述
第一行输入 2 个正整数,数字之间使用空格隔开,其中第一个数字表示 SUM,第二个数字表示 bucketBallNums 数组长度;
第二行输入 N 个正整数,数字之间使用空格隔开,表示 bucketBallNums 的每一项;
三、输出描述
找到一个 maxCapacity,来保证取出尽量少的球,并返回从每个小桶拿出的小球数量组成的数组。
四、解题思路
- 从max开始递减遍历,依次尝试设置容量最大值 maxCapacity;
- 遍历每个小桶,计算从每个小桶中拿出的小球数量,并将其累加到total;
- 如果total小于等于小球最大总数sum,说明已经找到了满足条件的maxCapacity;
- 更新每个小桶中拿出的小球数量;
- 如果没有找到满足条件的maxCapacity,则尝试下一个maxCapacity的值;
- 如果所有的maxCapacity值都试过了,仍然没有找到满足条件的maxCapacity值,则输出空数组;
五、JavaScript算法源码
function findMaxCapacity(sum, bucketBallNums) {
const n = bucketBallNums.length;
let count = 0;
let maxNum = 0;
for (let i = 0; i < n; i++) {
count += bucketBallNums[i];
maxNum = Math.max(bucketBallNums[i], maxNum);
}
if (count <= sum) {
return [];
}
const min = Math.floor(sum / n);
let max = maxNum;
let total = 0;
for (let i = max; i >= min; i--) {
for (let j = 0; j < n; j++) {
total += Math.min(i, bucketBallNums[j]);
}
if (total <= sum) {
for (let j = 0; j < n; j++) {
bucketBallNums[j] = Math.max(0, bucketBallNums[j] - i);
}
return bucketBallNums;
}
total = 0;
}
return [];
}
六、效果展示
1、输入
3 3
1 2 3
2、输出
[0, 1, 2]
3、说明
小球总数为6,sum为3,超出范围,需要从小桶中取出球,maxCapacity = 1,小球总数为3,从1号桶取0个球,从2号桶取1个球,从3号桶取2个球。
🏆下一篇:华为OD机试真题 JavaScript 实现【贪心的商人】【2023Q1 100分】
🏆本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。