华为OD机试真题——开放日活动/取出尽量少的球(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

article/2025/7/19 6:54:12

在这里插入图片描述

2025 A卷 200分 题型

本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析;
并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式!

本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》

华为OD机试真题《开放日活动/取出尽量少的球》:


目录

    • 题目名称:开放日活动/取出尽量少的球
      • 题目描述
    • Java
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
      • 综合分析
    • python
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
      • 综合分析
    • JavaScript
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
      • 综合分析
    • C++
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
      • 综合分析
    • C语言
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
      • 综合分析
    • GO
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
      • 综合分析


题目名称:开放日活动/取出尽量少的球


  • 知识点:二分查找、逻辑处理
  • 时间限制:1秒
  • 空间限制:256MB
  • 限定语言:不限

题目描述

某部门开展开放日活动,其中一个游戏是从桶里取球。游戏规则如下:

  • N 个容量相同的小桶等距排开,每个小桶默认装有不同数量的小球,记录在数组 bucketBallNums 中。
  • 游戏开始时,所有桶的小球总数不能超过 SUM。若超过,需对所有小桶设置统一的容量最大值 maxCapacity,并将超过此值的球取出,直到每个桶的球数不超过 maxCapacity

限制规则

  1. 总和未超限:若所有桶的总球数 ≤ SUM,返回空数组 []
  2. 总和超限:若总球数 > SUM,需计算 maxCapacity,并返回每个桶取出的小球数量数组。要求 maxCapacity 尽可能大,且取出球数最少。

输入描述

  • 第一行为两个正整数:SUMbucketBallNums 数组长度 N
  • 第二行为 N 个正整数,表示 bucketBallNums 的每个元素。

输出描述

  • 返回一个数组,表示每个桶取出的小球数量。若无需操作,返回 []

示例
输入:

14 7  
2 3 2 5 5 1 4  

输出:

[0, 1, 0, 3, 3, 0, 2]  

说明

  • 总球数为 2+3+2+5+5+1+4=22 > 14。
  • 设置 maxCapacity=2,各桶保留球数为 [2,2,2,2,2,1,2],取出球数为 [0,1,0,3,3,0,2],总和为 9(22-13=9≤14)。

补充说明

  • 1 ≤ N ≤ 1e51 ≤ SUM ≤ 1e91 ≤ bucketBallNums[i] ≤ 1e9
  • 必须通过二分法高效求解 maxCapacity

Java

问题分析

我们需要在给定多个小桶的情况下,设置一个统一的最大容量 maxCapacity,使得调整后的总球数不超过 SUM。目标是找到最大的 maxCapacity 并计算每个桶需要取出的小球数量。


解题思路

  1. 初始判断:计算所有桶的总球数,若不超过 SUM,直接返回空数组。
  2. 二分查找确定最大容量
    • 使用二分法在 0 到最大桶球数之间寻找满足总球数条件的最大 maxCapacity
  3. 计算取出球数:根据找到的 maxCapacity,计算每个桶需要取出的小球数量。

代码实现

import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int SUM = sc.nextInt();int N = sc.nextInt();int[] buckets = new int[N];long total = 0;int maxBall = 0;// 读取桶的初始球数并计算总和及最大值for (int i = 0; i < N; i++) {buckets[i] = sc.nextInt();total += buckets[i];maxBall = Math.max(maxBall, buckets[i]);}// 初始总和未超限,直接返回空数组if (total <= SUM) {System.out.println("[]");return;}// 二分查找确定最大允许的 maxCapacityint left = 0, right = maxBall;int maxCapacity = 0;while (left <= right) {int mid = left + (right - left) / 2;long currentSum = 0;for (int num : buckets) {currentSum += Math.min(num, mid);}if (currentSum <= SUM) {maxCapacity = mid;   // 当前 mid 可能为可行解,尝试更大的值left = mid + 1;} else {right = mid - 1;     // 当前 mid 导致总和过大,减小上限}}// 计算各桶需要取出的球数int[] result = new int[N];for (int i = 0; i < N; i++) {result[i] = buckets[i] - Math.min(buckets[i], maxCapacity);}// 格式化输出System.out.println(Arrays.toString(result).replace(" ", ""));}
}

代码详细解析

  1. 输入处理

    • 使用 Scanner 读取输入的 SUM 和桶的数量 N
    • 读取每个桶的球数存入数组 buckets,并计算总球数 total 及最大值 maxBall
  2. 初始判断

    • 若初始总球数 total 不超过 SUM,直接输出空数组 []
  3. 二分查找

    • 范围设定:左边界 left 为 0,右边界 right 为最大桶球数 maxBall
    • 循环条件:当 left <= right 时,计算中间值 mid,并计算当前 mid 对应的总球数 currentSum
    • 调整策略:若 currentSum <= SUM,说明可以尝试更大的 mid,调整 left;否则调整 right
  4. 计算取出球数

    • 遍历每个桶,计算其需要取出的小球数量,即原始球数减去调整后的球数。
  5. 输出处理

    • 使用 Arrays.toString 将结果数组转换为字符串,并去除空格以符合题目要求。

示例测试

示例1输入:

14 7  
2 3 2 5 5 1 4  

输出

[0,1,0,3,3,0,2]

解析:最大容量为 2,取出球数总和为 9,调整后总球数为 13 ≤ 14。

示例2输入:

0 1  
1  

输出

[1]

解析:总球数 1 > 0,设置最大容量为 0,取出所有球。

示例3输入:

10 3  
5 5 5  

输出

[0,0,0]

解析:初始总球数 15 > 10,最大容量设为 3,调整后总球数为 9 ≤ 10。


综合分析

  1. 时间复杂度:O(N log M),其中 N 是桶的数量,M 是最大桶球数。二分查找的复杂度为 O(log M),每次查找需遍历数组。
  2. 空间复杂度:O(N),存储桶的球数数组和结果数组。
  3. 优势
    • 高效查找:二分法快速定位最大容量。
    • 避免冗余计算:每次遍历仅计算当前中间值的总球数。
  4. 适用场景:适用于大规模数据(桶数 ≤ 1e5)的场景,满足时间限制要求。

python

问题分析

我们需要在给定多个桶的情况下,设置一个统一的最大容量 maxCapacity,使得调整后的总球数不超过 SUM。目标是找到最大的 maxCapacity 并计算每个桶需要取出的小球数量。


解题思路

  1. 初始判断:计算所有桶的总球数,若不超过 SUM,直接返回空数组。
  2. 二分查找确定最大容量
    • 使用二分法在 0 到最大桶球数之间寻找满足总球数条件的最大 maxCapacity
  3. 计算取出球数:根据找到的 maxCapacity,计算每个桶需要取出的小球数量。

代码实现

def main():import sysinput 

http://www.hkcw.cn/article/OqfqJlsqKZ.shtml

相关文章

day14 leetcode-hot100-25(链表4)

141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 1.哈希集合 思路 将节点一个一个加入HashSet&#xff0c;并用contains判断是否存在之前有存储过的节点&#xff0c;如果有便是环&#xff0c;如果没有便不是环。 具体代码 /*** Definition for singly-linked list.*…

低碳理念在道路工程中的应用-预制路面

一、引子 在上一篇文章里&#xff0c;给大家介绍了预制基层的应用&#xff0c;有人提出&#xff0c;既然基层能够预制&#xff0c;那么&#xff0c;道路面层能不能预制呢&#xff0c;有没有相关的研究成果和应用实例呢&#xff1f;答案是肯定的&#xff0c;在本篇文章中&#x…

React---day5

4、React的组件化 组件的分类&#xff1a; 根据组件的定义方式&#xff0c;可以分为&#xff1a;函数组件(Functional Component )和类组件(Class Component)&#xff1b;根据组件内部是否有状态需要维护&#xff0c;可以分成&#xff1a;无状态组件(Stateless Component )和…

Muplayer——轻量级在线JavaScript 音乐播放器

简单的 JavaScript 音乐播放器 GitHub 地址&#xff1a;https://github.com/Wcowin/Muplayer 在线地址&#xff1a;https://wcowin.work/Muplayer/ 本项目是一个基于原生 JavaScript、HTML 和 CSS 实现的响应式音乐播放器&#xff0c;支持本地音乐添加、播放列表管理、搜索、…

毫秒断电,安全守护|维安WPB系列主动型熔断器重磅登场!

1 主动型熔断器 新能源时代的“主动保护”趋势 随着新能源汽车行业的高速发展&#xff0c;其相关安全事故也层出不穷。为此&#xff0c;工信部于2025 年3月 28 日组织制定了强制性国家标准《电动汽车用动力蓄电池安全要求》&#xff08;GB38031-2025&#xff09;&#xff0c…

Java—— 多线程 第二期

等待唤醒机制(生产者和消费者) 说明 之前的多线程是谁抢到CPU的执行权谁执行&#xff0c;而等待唤醒机制作为一种经典的多线程协作模式&#xff0c;可以实现线程的交替执行。 成员 实现等待唤醒机制需要三个成员&#xff1a;生产者、消费者、标志位 可以分别看作厨师、吃货、…

2025年最新《Python程序设计》题库(含答案)

判断题填空题选择题程序题 点击文末名片可以下载python工具和完整题库&#xff01; 第 1 章 基础知识 &#xff08;部分展示&#xff09; 1、 Python 是一种跨平台、开源、免费的高级动态编程语言。 2、 Python 3.x 完全兼容 Python 2.x。 3、 Python 3.x 和 Python 2.x 唯…

【AI非常道】二零二五年五月,AI非常道

经常在社区看到一些非常有启发或者有收获的话语&#xff0c;但是&#xff0c;往往看过就成为过眼云烟&#xff0c;有时再想去找又找不到。索性&#xff0c;今年开始&#xff0c;看到好的言语&#xff0c;就记录下来&#xff0c;一月一发布&#xff0c;亦供大家参考。 前面的记…

Linux入门(十一)进程管理

Linux 中每个执行的程序都称为一个进程&#xff0c;每个进程都分配一个ID号&#xff08;PID&#xff09; 每个进程都可能以两种方式存在&#xff0c;前台&#xff08;屏幕上可以操作的&#xff09;和后台&#xff08;屏幕上无法看到的&#xff09;&#xff0c;一般系统的服务都…

晨控CK-UR12与西门子PLC配置Modbus TCP通讯连接操作手册

晨控CK-UR12与西门子PLC配置Modbus TCP通讯连接操作手册 晨控CK-UR12系列作为晨控智能工业级别RFID读写器,支持大部分工业协议如RS232、RS485、以太网。支持工业协议Modbus RTU、Modbus TCP、Profinet、EtherNet/lP、EtherCat以及自由协议TCP/IP等。 本期主题&#xff1a;围绕…

Python使用

Python学习&#xff0c;从安装&#xff0c;到简单应用 前言 Python作为胶水语言在web开发&#xff0c;数据分析&#xff0c;网络爬虫等方向有着广泛的应用 一、Python入门 相关基础语法直接使用相关测试代码 Python编译器版本使用3以后&#xff0c;安装参考其他教程&#xf…

高德地图应用OceanBase单元化构建下一代在线地图服务

IEEE International Conference on Data Engineering (ICDE) 是数据库和数据工程领域的顶级学术会议之一&#xff08;与SIGMOD、VLDB并成为数据库三大顶会&#xff09;&#xff0c;自1984年首次举办以来&#xff0c;每年举办一次。ICDE涵盖广泛的主题&#xff0c;包括数据库系统…

软考-系统架构设计师-第十九章 嵌入式系统架构设计理论与实践

嵌入式系统架构设计理论与实践 19.1 嵌入式系统发展历程19.2 嵌入式系统硬件19.3 嵌入式系统软件19.4 嵌入式系统软件架构设计方法19.5 嵌入式系统软件架构实践 19.1 嵌入式系统发展历程 发展历程硬件软件主要特点单片微型计算机&#xff08;SCM&#xff09;单片机无操作系统 …

DeepSeek-R1 重磅升级,智能体验再进化!

DeepSeek AI 爱好者们注意啦&#xff01;DeepSeek R1 模型完成小版本升级&#xff0c;新版本 DeepSeek-R1-0528 震撼登场。想体验超强思考与推理能力&#xff1f;官方网站、APP、小程序&#xff0c;一键开启 “深度思考” 功能&#xff0c;新版等你来探索&#xff01;API 也同步…

预处理深入详解:预定义符号、宏、命名约定、命令行定义、条件编译、头文件的包含

目录 一、预定义符号 二、#define定义常量 三、宏 &#xff08;一&#xff09;#define定义宏 &#xff08;二&#xff09;带有副作用的宏参数 &#xff08;三&#xff09;宏替换的规则 &#xff08;四&#xff09;宏和函数的对比 四、#和## &#xff08;一&#xff09…

深度解析:跨学科论文 +“概念迁移表” 模板写作全流程

跨学科论文速通&#xff01;融合“概念迁移表”的写作导航模板 你的论文是否曾被导师皱眉评价为“四不像”&#xff1f;不同学科的术语在稿纸上打架&#xff0c;核心逻辑若隐若现&#xff1f; 别让心血沦为学术混搭的牺牲品。一张精心设计的 概念迁移表&#xff0c;能将两个看…

Linux安装及管理程序

1 Linux应用程序基础 1.1 Linux 命令与应用程序的关系 在 Linux 操作系统中&#xff0c;一直以来命令和应用程序并没有特别明确的区别&#xff0c;从长期使用习惯来看&#xff0c;可以通过以下描述来对两者进行区别&#xff1a; 应用程序命令的执行文件大多比较小&#xff0…

历年南京大学计算机保研上机真题

2025南京大学计算机保研上机真题 2024南京大学计算机保研上机真题 2023南京大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school Count Number of Binary Strings 题目描述 Given a positive integer n n n ( 3 ≤ n ≤ 90 3 \leq n \leq 90 3≤n≤…

酒店管理系统设计与实现

本科毕业设计(论文) 设计(论文)题目 酒店管理系统设计与实现 学生姓名 学生学号 所在学院 专业班级 校内指导教师 李建 企业指导教师 毕业设计(论文)真实性承诺及声明 学生对毕业设计(论文)真实性承诺 本人郑重声明:所提交的毕业设计(论文)作品是本人在指导教师的指…

Java web学习路径预览

Java web学习路径预览 &#xff08;图源&#xff1a;黑马程序员&#xff09; 目录 Java web学习路径预览 一、HTML、CSS、JS 1. HTML (HyperText Markup Language): 网页的骨架 2. CSS (Cascading Style Sheets): 网页的皮肤 3. JavaScript (JS): 网页的行为 二、Ajax、…