pythonjavacjsc_0">【华为OD-E卷-取出尽量少的球 200分(python、java、c++、js、c)】
题目
某部门开展 Family Day 开放日活动,其中有个从桶里取球的游戏,游戏规则如下:
有 N 个容量一样的小桶等距排开,且每个小桶都默认装了数量不等的小球,每个小桶装的小球数量记录在数组 bucketBallNums 中,
游戏开始时,要求所有桶的小球总数不能超过 SUM,如果小球总数超过 SUM,则需对所有的小桶统一设置一个容量最大值 maxCapacity,并需将超过容量最大值的小球拿出来,直至小桶里的小球数量小于 maxCapacity。
请您根据输入的数据,计算从每个小桶里拿出的小球数量?
限制规则一:所有小桶的小球总和小于 SUM,则无需设置容量值 maxCapacity,并且无需从小桶中拿球出来,返回结果[] 限制规则二:如果所有小桶的小球总和大于 SUM,则需设置容量最大值 maxCapacity,并且需从小桶中拿球出来,返回从每个小桶拿出的小球数量组成的数组
输入描述
- 第一行输入 2 个正整数,数字之间使用空格隔开,其中:
第一个数字表示 SUM 第二个数字表示 bucketBallNums 数组长度 第二行输入 N 个正整数,数字之间使用空格隔开,表示 bucketBallNums 的每一项
输出描述
- 从每个小桶里拿出的小球数量,并使用一维数组表示
备注
- 1 ≤ bucketBallNums[i] ≤ 10^9 1 ≤ bucketBallNums.length = N ≤ 10^5 1 ≤ maxCapacity ≤ 10^9 1 ≤ SUM ≤ 10^9
用例
用例一:
输入:
14 7
2 3 2 5 5 1 4
输出:
[0,1,0,3,3,0,2]
用例二:
输入:
3 3
1 2 3
输出:
[0,1,2]
用例三:
输入:
6 2
3 2
输出:
[]
python_71">python解法
- 解题思路:
- 输入解析:从用户输入中解析出总容量total、数组长度length和包含球的数量的数组balls。
目标:调整balls中每个元素的数量,确保调整后的总和小于或等于total,并返回移除的球的数量数组。
二分搜索优化:
用二分法计算调整的临界值min_capacity和max_capacity,逐步缩小范围以找到满足条件的分配方案。
每次尝试一个中间值mid_capacity,计算每个桶需要移除的数量,如果结果不满足条件,则调整搜索范围。
输出结果:返回移除的球的数量数组。
python">def parse_input():# 解析输入,获取总容量、数组长度和球的数量数组total, length = map(int, input().split()) # 输入总容量和数组长度balls = list(map(int, input().split())) # 输入每个桶的球数量return total, length, ballsdef calculate_removed_balls(total, balls, length):current_sum = sum(balls) # 计算当前球的总数if current_sum <= total:return "[]" # 如果总数已经小于或等于总容量,无需移除max_capacity = max(balls) # 最大球数量min_capacity = total // length # 计算理论上的最小分配容量# 初始结果数组,计算每个桶超出的球数量result = [x - min_capacity if x > min_capacity else 0 for x in balls]# 使用二分搜索优化移除球的数量while max_capacity - min_capacity > 1:mid_capacity = (max_capacity + min_capacity) // 2 # 计算中间值# 临时结果数组,假设移除到 mid_capacitytmp_result = [x - mid_capacity if x > mid_capacity else 0 for x in balls]remaining_sum = current_sum - sum(tmp_result) # 计算移除后的总和if remaining_sum > total:max_capacity = mid_capacity # 总和仍大于总容量,减少容量elif remaining_sum < total:min_capacity = mid_capacity # 总和小于总容量,增加容量result = tmp_result # 更新结果数组else:result = tmp_result # 精确匹配,直接返回结果break# 返回结果数组的字符串形式return "[" + ",".join(map(str, result)) + "]"def main():total, length, balls = parse_input() # 解析输入print(calculate_removed_balls(total, balls, length)) # 计算并输出结果if __name__ == "__main__":main()
java_127">java解法
- 解题思路
java">更新中
C++解法
- 解题思路
更新中
C解法
更新中
JS解法
javascript">更新中
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏