news 2026/3/12 19:12:17

华为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/3/12 18:35:27

Java堆外内存泄漏难题破解(一线专家实战经验总结)

第一章&#xff1a;Java堆外内存泄漏难题破解&#xff08;一线专家实战经验总结&#xff09;在高并发、大数据量的生产环境中&#xff0c;Java应用频繁遭遇堆外内存持续增长导致的系统崩溃问题。尽管堆内存监控正常&#xff0c;但进程总内存占用不断上升&#xff0c;最终触发OO…

作者头像 李华
网站建设 2026/3/10 17:44:13

bpftrace脚本统计Sonic系统调用频率

bpftrace脚本统计Sonic系统调用频率 在AI驱动的数字人视频生成系统中&#xff0c;性能问题往往隐藏在高层逻辑之下——用户看到的是流畅的唇形同步与自然表情&#xff0c;而背后却是密集的文件读写、频繁的内存映射和复杂的线程协作。当一个基于Sonic模型的生成任务突然变慢&am…

作者头像 李华
网站建设 2026/3/11 14:28:37

组织进化论——重塑团队、流程与文化以赢在GEO时代

引言&#xff1a;当旧架构无法适应新现实技术可以快速引进&#xff0c;策略可以一夜调整&#xff0c;但组织的变革往往是最艰难、最滞后的部分。生成式AI驱动的GEO&#xff08;生成式体验优化&#xff09;革命&#xff0c;对企业的冲击最终会穿透工具和战术层面&#xff0c;直指…

作者头像 李华
网站建设 2026/3/9 8:00:09

Trivy扫描Sonic镜像漏洞确保供应链安全

Trivy扫描Sonic镜像漏洞确保供应链安全 在AI模型服务化加速落地的今天&#xff0c;一个看似不起眼的依赖包漏洞&#xff0c;可能就会让整个数字人系统暴露于远程代码执行的风险之下。这并非危言耸听——2023年Log4j漏洞事件后&#xff0c;越来越多企业意识到&#xff1a;模型能…

作者头像 李华
网站建设 2026/3/13 5:54:15

ClamAV扫描Sonic上传音频文件防病毒注入

ClamAV扫描Sonic上传音频文件防病毒注入 在AI生成内容&#xff08;AIGC&#xff09;快速普及的今天&#xff0c;数字人技术正以前所未有的速度渗透进教育、电商、政务等多个领域。以腾讯与浙江大学联合研发的轻量级口型同步模型 Sonic 为例&#xff0c;用户只需一张静态人脸图和…

作者头像 李华
网站建设 2026/3/9 13:56:44

如何用Sonic生成超高品质数字人视频?高分辨率输出配置方案

如何用Sonic生成超高品质数字人视频&#xff1f;高分辨率输出配置方案 在虚拟内容爆发式增长的今天&#xff0c;用户对数字人视频的质量要求早已从“能看”转向“媲美真人”。无论是电商直播中口型精准的带货主播&#xff0c;还是在线课程里表情自然的AI讲师&#xff0c;背后都…

作者头像 李华