news 2026/7/22 20:25:44

华为OD机试双机位C卷 - 部门人力分配 (C++ Python JAVA JS GO)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD机试双机位C卷 - 部门人力分配 (C++ Python JAVA JS GO)

部门人力分配

2025华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型

华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解

题目描述

部门在进行需求开发时需要进行人力安排。

当前部门需要完成 N 个需求,需求用 requirements 表述,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。

这部分需求需要在 M 个月内完成开发,进行人力安排后每个月人力时固定的。

目前要求每个月最多有2个需求开发,并且每个月需要完成的需求不能超过部门人力。

请帮助部门评估在满足需求开发进度的情况下,每个月需要的最小人力是多少?

输入描述

输入为 M 和 requirements,M 表示需求开发时间要求,requirements 表示每个需求工作量大小,N 为 requirements长度,

  • 1 ≤ N/2 ≤ M ≤ N ≤ 10000
  • 1 ≤ requirements[i] ≤ 10^9

输出描述

对于每一组测试数据,输出部门需要人力需求,行末无多余的空格

用例1

输入

3 3 5 3 4

输出

6

说明

输入数据两行,

第一行输入数据3表示开发时间要求,

第二行输入数据表示需求工作量大小,

输出数据一行,表示部门人力需求。

当选择人力为6时,2个需求量为3的工作可以在1个月里完成,其他2个工作各需要1个月完成。可以在3个月内完成所有需求。当选择人力为5时,4个工作各需要1个月完成,一共需要4个月才能完成所有需求。因此6是部门最小的人力需求。

题解

思路:二分 + 双指针

  1. 比较经典的二分题型,一般这种在满足什么条件下,求最小/最大是比较典型的二分特征题。

  2. 首先确认上下边界,注意题目限制1 ≤ N/2 ≤ M其实是已经限制了题目肯定有解。

    • left = 最大要求天数需求,由需要完成的需求不能超过部门人力决定,确定了边界。
    • right = 最大要求天数需求 + 次打要求天数需求需要完成的需求不能超过部门人力每个月最多有2个需求开发共同确定。
  3. 确定上下边界之后就是枚举找到满足条件的最小部门人数值,每次枚举mid = (left + right) /2,判断是否可以在m个月完成,然后收缩边界,直到left == right结束:

    • 不能在m个月完成,移动left = mid + 1
    • 能在m个月满足,移动right = mid
  4. 判断是否能在m个月判断采用双指针进行处理,这里要处理的问题其实在指定人数下,完成这些任务需要的月数,并且一个月最多完成两个任务,为了减少月数,尽量是让每个月完成两个任务。所以采用下面的逻辑,尽量让最小和最大组合,先将requirements升序排序,指针l = 0, r = requirements.size()

    1. 如果requirements[l] + requirements[r] <= mid: 进行l++,r --处理,需要处理月份+1
    2. 否则贪心处理任务量大的,r--,需要处理月份+1
    3. 执行1 2逻辑直到l < r结束,判断需要月份是否小于m
  5. 二分结束之后,left 或者right就是结果。

额外注意由于1≤ requirements[i] ≤ 10^9在计算过程使用int会造成移除,改使用long,对于js推荐使用BigInt处理。

c++

#include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> #include<cmath> #include<map> using namespace std; // 通用 切割函数 函数 将字符串str根据delimiter进行切割 vector<int> split(const string& str, const string& delimiter) { vector<int> result; size_t start = 0; size_t end = str.find(delimiter); while (end != string::npos) { result.push_back(stoi(str.substr(start, end - start))); start = end + delimiter.length(); end = str.find(delimiter, start); } // 添加最后一个部分 result.push_back(stoi(str.substr(start))); return result; } bool check(vector<int>& requirements, int personCount, int m) { long needMonth = 0; int l = 0, r = requirements.size() -1; // 双指针求最小月数 while (l <= r) { if (l == r) { needMonth++; r--; continue; } long actualPeronCount = requirements[l] + requirements[r]; // 一同处理 if (actualPeronCount <= personCount) { l++; r--; // 选择消耗工作量大的 } else { r--; } needMonth++; } return needMonth <= m; } int main() { int m; cin >> m; string input; // 忽略空行 cin.ignore(); getline(cin, input); vector<int> requirements = split(input, " "); int n = requirements.size(); sort(requirements.begin(), requirements.end()); // 每个月需要完成的需求不能超过部门人力,决定必须满足单个需求可以在一个月完成 long left = requirements[n-1]; // 单月最多两个需求,限制了最大人数 long right = requirements[n-1] + requirements[n - 2]; // 二分 while (left < right) { long mid = (left + right) >> 1; if (check(requirements, mid, m)) { right = mid; } else { left = mid + 1; } } cout << left; return 0; }

JAVA

import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.*; public class Main { // 判断在 personCount 人力下,是否能在 m 个月内完成 static boolean check(List<Integer> requirements, long personCount, int m) { long needMonth = 0; int l = 0, r = requirements.size() - 1; // 双指针求最小月数 while (l <= r) { if (l == r) { needMonth++; r--; continue; } long actualPersonCount = requirements.get(l) + requirements.get(r); // 一同处理 if (actualPersonCount <= personCount) { l++; r--; } else { // 只能处理大的那个 r--; } needMonth++; } return needMonth <= m; } public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int m = Integer.parseInt(br.readLine()); String[] parts = br.readLine().trim().split("\\s+"); List<Integer> requirements = new ArrayList<>(); for (String p : parts) { requirements.add(Integer.parseInt(p)); } Collections.sort(requirements); int n = requirements.size(); // 单个需求必须能在一个月完成 long left = requirements.get(n - 1); // 单月最多两个需求 long right = requirements.get(n - 1) + requirements.get(n - 2); // 二分查找 while (left < right) { long mid = (left + right) >> 1; if (check(requirements, mid, m)) { right = mid; } else { left = mid + 1; } } System.out.println(left); } }

Python

defcheck(requirements,person_count,m):need_month=0l,r=0,len(requirements)-1# 双指针求最小月数whilel<=r:ifl==r:need_month+=1r-=1continueactual_person_count=requirements[l]+requirements[r]# 一同处理ifactual_person_count<=person_count:l+=1r-=1else:# 只能处理大的那个r-=1need_month+=1returnneed_month<=m m=int(input())requirements=list(map(int,input().split()))requirements.sort()n=len(requirements)# 单个需求必须能在一个月完成left=requirements[-1]# 单月最多两个需求right=requirements[-1]+requirements[-2]# 二分查找whileleft<right:mid=(left+right)//2ifcheck(requirements,mid,m):right=midelse:left=mid+1print(left)

JavaScript

constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout});letlines=[];rl.on('line',line=>{lines.push(line.trim());});rl.on('close',()=>{constm=BigInt(lines[0]);constrequirements=lines[1].split(/\s+/).map(BigInt);requirements.sort((a,b)=>(a<b?-1:1));functioncheck(personCount){letneedMonth=0n;letl=0,r=requirements.length-1;while(l<=r){if(l===r){needMonth++;r--;continue;}constactualPersonCount=requirements[l]+requirements[r];if(actualPersonCount<=personCount){l++;r--;}else{r--;}needMonth++;}returnneedMonth<=m;}letleft=requirements[requirements.length-1];letright=requirements[requirements.length-1]+requirements[requirements.length-2];// BigInt 二分while(left<right){constmid=(left+right)/2n;if(check(mid)){right=mid;}else{left=mid+1n;}}console.log(left.toString());});

Go

packagemainimport("bufio""fmt""os""sort")funccheck(requirements[]int,personCountint64,mint)bool{varneedMonthint64=0l,r:=0,len(requirements)-1// 双指针求最小月数forl<=r{ifl==r{needMonth++r--continue}actualPersonCount:=int64(requirements[l]+requirements[r])// 一同处理ifactualPersonCount<=personCount{l++r--}else{// 只能处理大的那个r--}needMonth++}returnneedMonth<=int64(m)}funcmain(){in:=bufio.NewReader(os.Stdin)varmintfmt.Fscanln(in,&m)varrequirements[]intfor{varxint_,err:=fmt.Fscan(in,&x)iferr!=nil{break}requirements=append(requirements,x)}sort.Ints(requirements)n:=len(requirements)// 单个需求必须能在一个月完成left:=int64(requirements[n-1])// 单月最多两个需求right:=int64(requirements[n-1]+requirements[n-2])// 二分查找forleft<right{mid:=(left+right)>>1ifcheck(requirements,mid,m){right=mid}else{left=mid+1}}fmt.Println(left)}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/20 8:34:42

前馈神经网络架构设计实战:从入门到进阶的高效构建指南

前馈神经网络架构设计实战&#xff1a;从入门到进阶的高效构建指南 【免费下载链接】nndl.github.io 《神经网络与深度学习》 邱锡鹏著 Neural Network and Deep Learning 项目地址: https://gitcode.com/GitHub_Trending/nn/nndl.github.io 前馈神经网络作为深度学习的…

作者头像 李华
网站建设 2026/7/18 8:04:32

JMeter模拟海量请求评估Sonic吞吐量极限

JMeter模拟海量请求评估Sonic吞吐量极限 在短视频、虚拟主播和AI内容生成爆发式增长的今天&#xff0c;一个看似简单的“说话头像”背后&#xff0c;往往隐藏着复杂的实时推理系统。以腾讯与浙江大学联合推出的轻量级数字人口型同步模型 Sonic 为例&#xff0c;它能基于一张静态…

作者头像 李华
网站建设 2026/7/22 7:44:02

边界、伦理与未来形态——GEO革命的深远影响与终极思考

引言&#xff1a;超越营销的技术浪潮当我们深入探讨生成式AI对搜索和营销的重构时&#xff0c;必须意识到&#xff0c;我们所讨论的远不止于一个行业的革新。GEO&#xff08;生成式体验优化&#xff09;革命是一股更深层技术浪潮的表征&#xff0c;它触及信息权力结构、经济模型…

作者头像 李华
网站建设 2026/7/16 14:00:07

数据解谜新利器:宏智树AI如何重塑论文数据分析的“黄金法则”?

在论文写作的征途中&#xff0c;数据分析无疑是那把开启真理之门的钥匙。它不仅能够将杂乱无章的数据转化为有价值的信息&#xff0c;还能为研究者的结论提供坚实的支撑。然而&#xff0c;传统数据分析方法往往耗时费力&#xff0c;且对研究者的统计功底要求极高。今天&#xf…

作者头像 李华
网站建设 2026/7/22 9:58:55

Allure报告美化Sonic自动化测试结果展示

Allure报告集成Sonic数字人视频实现测试结果动态可视化 在智能语音系统日益普及的今天&#xff0c;自动化测试面临的挑战已不再局限于功能逻辑的校验。当一个车载语音助手回答“前方300米右转”时&#xff0c;我们不仅要确认它说了这句话&#xff0c;更要验证它的“口型是否同步…

作者头像 李华
网站建设 2026/7/22 3:23:06

【Java微服务革命】:Quarkus 2.0如何实现超低内存占用的底层逻辑解析

第一章&#xff1a;Quarkus 2.0内存优化的革命性意义Quarkus 2.0 的发布标志着 Java 生态在云原生领域迈出了关键一步&#xff0c;其内存优化机制带来了革命性的性能提升。传统 JVM 应用在容器化环境中常因高内存占用导致资源浪费与启动延迟&#xff0c;而 Quarkus 2.0 通过深度…

作者头像 李华