华为OD机试真题——求最多可以派出多少支队伍(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

news2025/6/2 17:31:58

在这里插入图片描述

2025 A卷 100分 题型

本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》

华为OD机试真题《求最多可以派出多少支队伍》:


文章快捷目录

题目描述及说明

Java

python

JavaScript

C

GO


题目名称:求最多可以派出多少支队伍


  1. 知识点:贪心算法、双指针、排序
  2. 时间限制:1秒
  3. 空间限制:256MB
  4. 限定语言:不限

题目描述

用数组代表每个人的能力,一个比赛活动要求参赛团队的最低能力值为N。每个团队可以由1人或2人组成,且1个人只能参加1个团队。请计算出最多可以派出多少支符合要求的团队?

输入描述

  • 第一行为总人数,范围[1,500000]。
  • 第二行为每个人的能力值数组,元素取值范围[1,500000],数组大小与总人数一致。
  • 第三行为团队要求的最低能力值N,范围[1,500000]。

输出描述

  • 最多可以派出的团队数量。

示例
输入:

5  
3 1 5 7 9  
8  

输出:

3  

说明:

  • 3和5组成一队(3+5≥8),1和7组成一队(1+7≥8),9单独一队(9≥8),共3队。

Java

问题分析

我们需要从一组人中选出尽可能多的团队,每个团队可以由1人或2人组成,且能力值之和需达到最低要求N。目标是找到最大的团队数量。


解题思路

  1. 排序数组:将能力值从小到大排序,便于双指针操作。
  2. 贪心策略:使用双指针,优先让能力大的人单独成队,若不能则尝试与能力小的人组队。
  3. 双指针操作
    • 右指针从最大能力开始,若单独满足要求则成队。
    • 否则尝试与左指针的人组队,若满足则成队,否则左移找更小能力的人。

代码实现

import java.util.Arrays;
import java.util.Scanner;

public class Main {
   
    public static void main(String[] args) {
   
        Scanner scanner = new Scanner(System.in);
        int total = scanner.nextInt();
        int[] abilities = new int[total];
        for (int i = 0; i < total; i++) {
   
            abilities[i] = scanner.nextInt();
        }
        int N = scanner.nextInt();
        Arrays.sort(abilities); // 将能力值排序,便于双指针操作
        int left = 0;          // 左指针,指向当前最小未处理的能力值
        int right = total - 1; // 右指针,指向当前最大未处理的能力值
        int count = 0;         // 统计符合要求的团队数量

        while (left <= right) {
    // 当还有人未处理时循环
            if (abilities[right] >= N) {
    // 右指针的人能力值达标,单独成队
                count++;
                right--; // 处理下一个更大的能力值(指针左移)
            } else {
    // 右指针的人无法单独成队,尝试与左指针的人组队
                if (left < right && abilities[left] + abilities[right] >= N) {
    
                    // 左右指针不同且组合达标
                    count++;
                    left++; // 左指针右移,处理下一个更小的能力值
                    right--; // 右指针左移,处理下一个更大的能力值
                } else {
    
                    // 无法组队,左指针右移(当前右指针的人无法配对,只能放弃)
                    left++;
                }
            }
        }
        System.out.println(count);
    }
}

代码详解

  1. 输入处理:读取总人数、能力数组和最低要求N。
  2. 排序:将数组排序,便于双指针从两端向中间处理。
  3. 双指针初始化left指向最小元素,right指向最大元素。
  4. 循环处理
    • 右指针单独成队:若当前右指针的人能力≥N,直接成队。
    • 尝试组队:若左右指针非同一人且能力之和≥N,组队。
    • 无法处理:左指针右移,放弃当前右指针的人。
  5. 输出结果:统计所有可能的队伍数量。

示例测试

  1. 示例输入1

    5
    3 1 5 7 9
    8
    

    输出:3
    说明:3和5组队,1和7组队,9单独成队。

  2. 示例输入2

    2
    4 5
    8
    

    输出:1
    说明:4和5组队。

  3. 示例输入3

    3
    3 3 3
    5
    

    输出:1
    说明:其中两人组队(3+3≥5),剩下一人无法成队。


综合分析

  1. 时间复杂度:O(n log n),排序耗时O(n log n),双指针遍历O(n)。
  2. 空间复杂度:O(1),仅使用常量额外空间。
  3. 正确性
    • 贪心策略确保每次尽可能组成最多的队伍。
    • 排序和双指针处理所有可能的组合。
  4. 适用性
    • 处理大规模数据高效(如50万人)。
    • 逻辑清晰,避免复杂递归或动态规划。
  5. 为何最优
    • 贪心策略优先处理能力大的人,最大化利用高能力值。
    • 双指针保证线性时间复杂度,避免重复计算。

python

问题分析

我们需要从一组人中选出尽可能多的团队,每个团队可以由1人或2人组成,且能力值之和需达到最低要求N。目标是找到最大的团队数量。


解题思路

  1. 排序数组:将能力值从小到大排序,便于双指针操作。
  2. 贪心策略:使用双指针,优先让能力大的人单独成队,若不能则尝试与能力小的人组队。
  3. 双指针操作
    • 右指针从最大能力开始,若单独满足要求则成队。
    • 否则尝试与左指针的人组队,若满足则成队,否则左移找更小能力的人。

代码实现

def max_teams():
    import sys

    # 读取输入数据
    total = int(sys.stdin.readline())          # 总人数
    abilities = list(map(int, sys.stdin.readline().split()))  # 能力数组
    N = int(sys.stdin.readline())              # 团队最低能力要求

    # 将能力数组从小到大排序(排序后:左指针指向最小,右指针指向最大)
    abilities.sort()
    left = 0                # 左指针初始指向最小值
    right = total - 1       # 右指针初始指向最大值
    count = 0               # 统计符合要求的团队数量

    # 双指针贪心算法
    while left <= right:
        # 如果当前右指针的人能力值 >= N,单独成队
        if abilities[right] >= N:
            count += 1
            right -= 1      # 处理下一个更大的能力值(右指针左移)
        else:
            # 尝试与左指针的人组队
            if left < right and (abilities[left] + abilities[right] >= N):
                count += 1
                left += 1   # 左指针右移(处理更小的能力值)
                right -= 1  # 右指针左移(处理更大的能力值)
            else:
                # 无法组队,丢弃当前左指针的人(因为它无法与任何更大的值组队)
                left += 1
    print(count)

# 示例测试
if __name__ == 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2392606.html

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

相关文章

《软件工程》第 12 章 - 软件测试

软件测试是确保软件质量的关键环节&#xff0c;它通过执行程序来发现错误&#xff0c;验证软件是否满足需求。本章将依据目录&#xff0c;结合 Java 代码示例、可视化图表&#xff0c;深入讲解软件测试的概念、过程、方法及实践。 12.1 软件测试的概念 12.1.1 软件测试的任务 …

消息队列-kafka为例

目录 消息队列应用场景和基础知识MQ常见的应用场景MQ消息队列的两种消息模式如何保证消息队列的高可用&#xff1f;如何保证消息不丢失&#xff1f;如何保证消息不被重复消费&#xff1f;如何保证消息消费的幂等性&#xff1f;重复消费的原因解决方案 如何保证消息被消费的顺序…

学习STC51单片机20(芯片为STC89C52RCRC)

每日一言 生活不会一帆风顺&#xff0c;但你的勇敢能让风浪变成风景。 串口助手的界面就等于是pc端的页面设置的是pc端的波特率等等参数 程序里面的是单片机的波特率等等参数 串口助手是 PC 端软件 串口助手&#xff08;如 STC-ISP&#xff09;是运行在 PC 上的工具&#x…

链路追踪神器zipkin安装详细教程教程

今天分享下zipkin的详细安装教程&#xff0c;具体代码demo可以参考我上篇文章&#xff1a;Spring Cloud Sleuth与Zipkin深度整合指南&#xff1a;微服务链路追踪实战-CSDN博客 一、Zipkin是什么&#xff1f; Zipkin是由Twitter开源的一款分布式追踪系统&#xff08;现由OpenZ…

bug: uniCloud 查询数组字段失败

问题根源&#xff1a;使用了支付宝云 官方说&#xff1a;2024年11月之后创建的新的支付宝云空间&#xff0c;数组字段查询强制必须设置 array 类型的索引 布尔类型的查询&#xff0c;强制必须设置 bool 类型的索引。 方案一&#xff1a;找到云服务空间-》云数据库-》对应的表-…

视觉分析开发范例:Puppeteer截图+计算机视觉动态定位

一、选型背景&#xff1a;传统爬虫已无力应对的视觉挑战 在现代互联网环境中&#xff0c;尤其是小红书、抖音、B站等视觉驱动型平台&#xff0c;传统基于 HTML 的爬虫已经难以满足精准数据采集需求&#xff1a; 内容加载由 JS 动态触发&#xff0c;难以直接解析 HTML&#xf…

Linux 基础开发工具的使用

目录 前言 一&#xff1a;下载工具yum 二&#xff1a;文本编辑器vim 1. 命令模式 2. 插入模式 3. 底行模式 三&#xff1a;gcc和g 基本使用格式 常用选项及作用 编译过程示例 四、Linux 项目自动化构建工具 ——make/Makefile 1. make 与 Makefile 的关系 2. Make…

华为云Flexus+DeepSeek征文 | Dify-LLM平台一键部署教程及问题解决指南

作者简介 我是摘星&#xff0c;一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型&#xff0c;将实际使用经验分享给大家&#xff0c;希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 1. 前言 2. 准备工作 2.1 注册华为云账号 2.2 确…

哈工大计算机系统2025大作业——Hello的程序人生

计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 计算学部 学   号 2023113072 班 级 23L0513 学 生 董国帅 指 导 教 师 史先俊 计算机科学与…

Vue中van-stepper与input值不同步问题及解决方案

一、问题描述 在使用Vant UI的van-stepper步进器组件与原生input输入框绑定同一响应式数据时&#xff0c;出现以下现象&#xff1a; 通过步进器修改值后&#xff0c;页面直接输出{{ count }}和watch监听器均能获取最新值但input输入框显示的数值未同步更新&#xff0c;仍为旧…

react基础技术栈

react基础技术栈 react项目构建react的事件绑定React组件的响应式数据条件渲染和列表循环表单绑定 Props和组件间传值&#xff0c;插槽react中的样式操作 生命周期ref 和 context函数组件和hook高阶组件React性能问题React-route的三个版本react-router使用步骤react-router提供…

Three.js搭建小米SU7三维汽车实战(4)场景搭建

场地搭建 javascript // 导入threejs import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/addons/controls/OrbitControls.js"; // 1. 创建场景 const scene new THREE.Scene(); // 2. 创建相机 const camera ne…

Excel 统计某个字符串在指定区域出现的次数

【本文概要】 Excel 统计某个字符串在指定区域出现的次数&#xff1a; 1、Excel 统计一个单元格内的某字符串的出现次数 2、Excel 统计某一列所有单元格内的某字符串的出现次数 3、Excel 统计某一区域所有单元格内的某字符串的出现次数 1、Excel 统计一个单元格内的某字符串的出…

【Linux我做主】进度条小程序深度解析

Linux下C语言进度条程序深度解析 进度条小程序GitHub地址 前言前置知识回车换行&#xff08;CR/LF&#xff09;的深度解析历史渊源与技术规范在进度条/倒计时中的应用 缓冲区机制的全面剖析缓冲区引入缓冲类型对比进度条开发中的关键控制 进度条实现以小见大——倒计时倒计时最…

从Homebrew找到openssl.cnf文件并拷贝到Go项目下使用

安装OpenSSL 在 macOS 上下载和安装 OpenSSL 最常见和推荐的方式是使用 Homebrew&#xff0c;这是一个 macOS 缺失的包管理器。 如果您还没有安装 Homebrew&#xff0c;请先安装它。安装 Homebrew 后&#xff0c;安装 OpenSSL 只需要一条命令。 步骤 1&#xff1a;安装 Home…

微信小程序一次性订阅封装

封装代码如下&#xff1a; export async function subscribeMessage(tmplIds: string[]): Promise<ISubscribeMessagePromise> {// 模板ID// 1、获取设置状态const settings (await wx.getSetting({ withSubscriptions: true })).subscriptionsSetting || {}console.log…

安全帽检测算法AI智能分析网关V4守护工地/矿山/工厂等多场景作业安全

一、方案概述​ 在工业生产与建筑施工场景中&#xff0c;安全帽是保障人员安全的重要装备。但传统人工巡检效率低、易疏漏&#xff0c;难以满足现代安全管理需求。AI智能分析网关V4安全帽检测方案&#xff0c;借助人工智能与计算机视觉技术&#xff0c;实现作业现场安全帽佩戴…

Python自动化之selenium语句——打开、关闭浏览器和网页

目录 一、打开谷歌浏览器 1.双击桌面的Pycharm工具 2.新建Python文件&#xff0c;输入文件名 3.新建的Python文件如下 4.安装selenium库 5.导入包 二、打开网页、关闭网页、关闭浏览器 1.导入增加一个时间包 2.使用函数打包之前写的浏览器的配置 3.调用 4.打开百度网…

【数据结构】--二叉树--堆(上)

一、树的概念和结构 概念&#xff1a; 树是一种非线性的数据结构&#xff0c;他是由n(n>0)个有限结点组成一个具有层次关系的集合。其叫做树&#xff0c;是因为他倒过来看就和一棵树差不多&#xff0c;其实际上是根在上&#xff0c;树枝在下的。 树的特点&#xff1a; 1…

多线程(5)——单例模式,阻塞队列

目录 单例模式饿汉模式懒汉模式—单线程版懒汉模式—多线程版&#xff08;经典面试题&#xff09;懒汉模式—多线程版&#xff08;改进&#xff09; 阻塞队列阻塞队列是什么生产者消费者模型标准库中的阻塞队列-BlockingQueue阻塞队列实现 单例模式 单例模式是一种设计模式&am…