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

在这里插入图片描述

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.pswp.cn/diannao/85040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的3种AI写作节奏搭配模型,适合不同类型写作者

—不用内耗地高效写完一篇内容&#xff0c;原来可以这样搭配AI ✍️ 开场&#xff1a;为什么要“搭配节奏”写作&#xff1f; 很多人以为用AI写作&#xff0c;就是丢一句提示词&#xff0c;然后“等它写完”。 但你有没有遇到这些情况&#xff1a; AI写得很快&#xff0c;学境…

【知识点】第1章:程序设计基本方法

文章目录 知识点整理计算机的概念程序设计语言Python 语言概述Python 语言开发环境配置程序的基本编写方法 练习题简答题判断题 知识点整理 计算机的概念 计算机的定义&#xff1a;计算机是根据指令操作数据的设备。 计算机的两个基本特性&#xff1a; 功能性&#xff1a;计…

const ‘不可变’到底是值不变还是地址不变

const的基础规则 声明时必须初始化​ const a; // ❌ 报错&#xff1a;Missing initializer in const declaration const b 10; // ✅ 正确块级作用域​&#xff08;const 的作用域仅限于声明它的代码块&#xff09; if (true) {const x 100; } console.log(x); // ❌ 报错…

Netty 实战篇:为自研 RPC 框架加入异步调用与 Future 支持

我们在上篇实现了一个轻量级 RPC 框架&#xff0c;现在要进一步优化 —— 加入异步响应支持&#xff0c;让 RPC 通信变得真正高效、非阻塞、支持并发。 一、为什么需要异步调用&#xff1f; 上篇的 RPC 框架是“同步阻塞”的&#xff1a; 每次发送请求后&#xff0c;必须等待服…

for(auto a:b)和for(auto a:b)的区别

#include<iostream> using namespace std; int main() {string s( "hello world" );for (auto c:s)c t ;cout<<s<<endl; //结果为hello worldfor (auto &c:s)c t ;cout<<s<<endl; //结果为ttttttttttt }for(auto a:b)中b为一…

超级对话2:大跨界且大综合的学问融智学应用场景述评(不同第三方的回应)之二

摘要&#xff1a;《人机协同文明升维行动框架》提出以HIAICI/W公式推动认知革命&#xff0c;构建三大落地场景&#xff1a;1&#xff09;低成本认知增强神经接口实现300%学习效率提升&#xff1b;2&#xff09;全球学科活动化闪电战快速转化知识体系&#xff1b;3&#xff09;人…

多方法解决MNIST数字识别

全连接层 import torch from torchvision import datasets, transforms import torch.nn as nn import torch.optim as optim from tqdm import tqdm # 用于进度条显示 import os# 定义数据预处理(标准化+Tensor转换) transform = transforms.Compose([transforms.ToTensor…

安装 Node.js 和配置 cnpm 镜像源

一、安装 Node.js 方式一&#xff1a;官网下载&#xff08;适合所有系统&#xff09; 访问 Node.js 官网 推荐选择 LTS&#xff08;长期支持&#xff09;版本&#xff0c;点击下载安装包。 根据系统提示一步步完成安装。 方式二&#xff1a;通过包管理器安装&#xff08;建…

vue 自定义组件的事件绑定

基本知识点 &#x1f3af;什么是自定义事件 自定义事件是子组件向父组件发送消息的机制&#xff0c;通常用于通知父组件发生了某些行为或状态变化。 &#x1f4cc; 基本语法 子组件触发事件&#xff08;$emit&#xff09; this.$emit(事件名, 参数);或在 const emit de…

进程同步机制-信号量机制-记录型信号量机制中的的wait和signal操作

wait和signal是记录型信号量机制中用于实现进程同步与互斥的两个重要操作&#xff0c; wait 操作 wait(semaphores *S) {S->value --;if (S->value<0) block(S->list) }请求资源&#xff1a;S->value --; 这一步表示进程请求一个单位的资源&#xff0c;将信号…

sd webui 安装sd-webui-TemporalKit 加载报错解决办法

ModuleNotFoundError: No module named moviepy.editer 报错内容类似上面截图&#xff0c;我的已经解决&#xff0c;暂时无法截图了 处理方法&#xff1a; 重点说明&#xff1a;插件目录必须是TemporalKit&#xff0c;不能更改 进入到安装目录&#xff1a;extensions\Tempor…

decimal.js库处理js浮点数精度误差问题

1、经常遇到前端计算金额的时候出现精度误差问题&#xff0c;导致前后端计算的金额不一致导致校验过不去的情况&#xff0c;相信有不少人写过Math.floor(e*100)/100来实现保留2位小数&#xff0c;但是这么写就会出现上面的精度问题。怎么解决呢&#xff1f;这里使用的是decimal…

如何将 WSL 的 Ubuntu-24.04 迁移到其他电脑

在使用 Windows Subsystem for Linux (WSL) 时&#xff0c;我们可能会遇到需要将现有的 WSL 环境迁移到其他电脑的情况。无论是为了备份、更换设备&#xff0c;还是在不同电脑之间共享开发环境&#xff0c;掌握迁移 WSL 子系统的方法都是非常有用的。本文将以 Ubuntu-24.04 为例…

RISCV——内核及汇编

RISCV——内核及汇编 小狼http://blog.csdn.net/xiaolangyangyang 1、寄存器组&#xff08;ABI&#xff09; 2、异常及中断 XV6 trap&#xff08;二&#xff09;RISCV中断异常处理/定时器中断 mie&#xff1a;中断开关mip&#xff1a;中断状态mstatus.mie&#xff1a;全局中断…

算法日记32:埃式筛、gcd和lcm、快速幂、乘法逆元

一、埃式筛&#xff08;计算质数&#xff09; 1.1、概念 1.1.1、在传统的计算质数中&#xff0c;我们采用单点判断&#xff0c;即判断(2~sqrt(n))是否存在不合法元素&#xff0c;若存在则判否&#xff0c;否则判是 1.1.2、假设&#xff0c;此时我们需要求1~1000的所有质数&am…

使用 mysqldump 获取 MySQL 表的完整创建 DDL

要获取 MySQL 中某个表的完整创建 DDL&#xff08;仅结构&#xff0c;不含数据&#xff09;&#xff0c;可以使用 mysqldump 工具的以下命令&#xff1a; 基本命令格式 bash mysqldump -h [主机名] -u [用户名] -p --no-data --single-transaction --routines --triggers --…

Debian 系统 Python 开发全解析:从环境搭建到项目实战

Debian 系统 Python 开发全解析:从环境搭建到项目实战 在当今数字化时代,Python 凭借其简洁易读的语法和强大的功能,成为了最受欢迎的编程语言之一。Debian 作为一款稳定、安全且开源的 Linux 操作系统,为 Python 开发提供了理想的环境。本文将详细介绍在 Debian 系统上进…

实时技术对比:SSE vs WebSocket vs Long Polling

早期网站仅展示静态内容&#xff0c;而如今我们更期望&#xff1a;实时更新、即时聊天、通知推送和动态仪表盘。 那么要如何实现实时的用户体验呢&#xff1f;三大经典技术各显神通&#xff1a; • SSE&#xff08;Server-Sent Events&#xff09;&#xff1a;轻量级单向数据…

【前端】es6新特性全解

第一章 简介 1.1 ES6概述 1.1.1 ES6定义与发展历程 1. ES6 定义 ES6 全称 ECMAScript 6.0&#xff0c;它是 JavaScript 语言的下一代标准&#xff0c;对 JavaScript 语言进行了许多增强和扩展&#xff0c;带来了更简洁、更强大的语法特性。可以把 ES6 想象成是 JavaScript …

nlp中的频率就是权重吗

&#x1f522; 一、“频率”是什么&#xff1f; 在 NLP 中&#xff0c;**词频&#xff08;frequency&#xff09;**通常指的是&#xff1a; 某个单词或 token 在语料库中出现的次数&#xff08;或比例&#xff09; 举例&#xff1a; "The cat sat on the mat. The cat i…