当前位置: 首页 > article >正文

【华为OD-E卷-取出尽量少的球 100分(python、java、c++、js、c)】

【华为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解法

  • 解题思路:
  • 输入解析:从用户输入中解析出总容量total、数组长度length和包含球的数量的数组balls。
    目标:调整balls中每个元素的数量,确保调整后的总和小于或等于total,并返回移除的球的数量数组。
    二分搜索优化:
    用二分法计算调整的临界值min_capacity和max_capacity,逐步缩小范围以找到满足条件的分配方案。
    每次尝试一个中间值mid_capacity,计算每个桶需要移除的数量,如果结果不满足条件,则调整搜索范围。
    输出结果:返回移除的球的数量数组。
def parse_input():
    # 解析输入,获取总容量、数组长度和球的数量数组
    total, length = map(int, input().split())  # 输入总容量和数组长度
    balls = list(map(int, input().split()))    # 输入每个桶的球数量
    return total, length, balls

def 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_capacity
        tmp_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解法

  • 解题思路
更新中

C++解法

  • 解题思路
更新中

C解法

  • 解题思路

更新中

JS解法

  • 解题思路

更新中

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏


http://www.kler.cn/a/457441.html

相关文章:

  • 个人健康信息系统|Java|SSM|VUE| 前后端分离
  • 迟来的前端面试经验
  • 每日一学——监控工具(Grafana)
  • Git的使用流程(详细教程)
  • 异步爬虫之aiohttp的使用
  • 【深度学习基础之多尺度特征提取】多尺度卷积神经网络(MS-CNN)是如何在深度学习网络中提取多尺度特征的?附代码(二)
  • 【Pandas】pandas Series to_numpy
  • 路由器刷机TP-Link tp-link-WDR5660 路由器升级宽带速度
  • TCP/IP网络协议攻击
  • PyTorch快速入门教程【小土堆】之TensorBoard的使用
  • 深度学习的魔法世界
  • SpringCloud 系列教程:微服务的未来(二)Mybatis-Plus的条件构造器、自定义SQL、Service接口基本用法
  • RabbitMQ的优缺点:深入解析消息队列的核心力量
  • Mac mini m4安装PD和Crack和关闭SIP
  • 安全运营 -- splunk restapi 最小权限
  • 如何提高Redis服务器的最大打开文件数限制
  • Flutter实现可拖拽操作Draggable
  • Pytorch注意力机制应用到具体网络方法(闭眼都会版)
  • vue导入导出excel、设置单元格文字颜色、背景色、合并单元格(使用xlsx-js-style库)
  • R 语言科研绘图第 11 期 --- 柱状图-基础
  • Linux -- 从抢票逻辑理解线程互斥
  • 酷瓜云课堂(内网版)v1.1.8 发布,局域网在线学习平台方案
  • 关于新手学习React的一些忠告
  • Selenium+Java(21):Jenkins发送邮件报错Not sent to the following valid addresses解决方案
  • 最新版Chrome浏览器加载ActiveX控件技术——alWebPlugin中间件V2.0.28-迎春版发布
  • 程序员学习方针