【独家OD2023C卷真题】20天拿下华为OD笔试【二分查找】2023C-部门人力分配【欧弟算法】全网注释最详细分类最全的华为OD真题题解

题目描述与示例

题目描述

部门在进行需求开发时需要进行人力安排。当前部门需要完成 N 个需求,需求用 requirements[i] 表示,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。这部分需求需要在 M 个月内完成开发,进行人力安排后每个月的人力是固定的。

目前要求每个月最多有 2 个需求开发,并且每个月需要完成的需求不能超过部门人力。请帮部门评估在满足需求开发进度的情况下,每个月需要的最小人力是多少?

输入描述

输入第一行为 M ,第二行为 requirements

M 表示需要开发时间要求,requirements 表示每个需求工作量大小

N` 为 `requirements` 长度,`1 ≤ N / 2 ≤ M ≤ N ≤ 10000`,`1 ≤ requirements[i]≤ 10^9

输出描述

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

示例

输入

3
3 5 3 4

输出

6

说明

输入数据两行,第一行输入数据 3 表示开发时间要求,第二行输入数据表示需求工作量大小,输出数据一行,表示部门人力需求。

当选择人力为6时,2个需求量为3的工作可以在1个月里完成,其他2个工作各需要1个月完成。可以在3个月内完成所有需求。

当选择人力为5时,4个工作各需要1个月完成,一共需要4个月才能完成所有需求。

因此6是部门最小的人力需求。

解题思路

题目描述不是特别清晰,只能通过示例进行反推。

考虑子问题,在设置人力需求为**k**时,需要多少个月能够完成所有工作。这个子问题与课上讲过的LeetCode881. 救生艇是完全一致的。

子问题中的人力需求k就等价于救生艇中的最大承重limit,且每次选择都只能至多选择数组中的两个元素。该子问题使用排序+双指针+贪心的策略来完成,其代码如下

def check(k, nums):left, right, ans = 0, len(nums) - 1, 0while left <= right:if nums[left] + nums[right] > k:right -= 1else:left += 1right -= 1ans += 1return ans

注意nums数组必须先排序,才可以使用上述的贪心策略。

再得到check函数之后,就需要找到一个适合的k了。显然k的取值是存在二段性的:

  • k很小时,需要N个月才能完成工作,即每一个月都只能完成1个工作
  • k很大时,可以只花N/2个月就完成工作,即每一个月都可以完成2个工作
  • 又因为N/2 ≤ M ≤ N成立,故一定存在一个k,恰好能够在M个月内完成工作

因此考虑二分查找完成本题。其主要代码如下

left, right = max(nums), sum(nums) + 1while left < right:mid = left + (right - left) // 2if check(mid, nums) <= m:right = midelse:left = mid + 1print(left)

PS:本题综合性比较强,同时涉及了双指针贪心和二分查找,还需要大家多加练习以将所有知识融会贯通。

代码

Python

# 题目:【二分查找】2023C-部门人力分配
# 分值:200
# 作者:许老师-闭着眼睛学数理化
# 算法:二分查找/贪心
# 代码看不懂的地方,请直接在群上提问
# 相关题目:LeetCode881.救生艇m = int(input())
nums = list(map(int, input().split()))
# 对nums数组进行排序,方便后续每一次二分中的贪心过程
nums.sort()# 子问题
# 计算在人力需求为k时
# 需要最少多少个月才能完成所有需求nums
def check(k, nums):# 初始化left和right两个指针,指向一头一尾;初始化答案变量ansleft, right, ans = 0, len(nums) - 1, 0# 进行循环,退出循环条件为两指针相遇,表示需求都完成while left <= right:# 如果两个工作所需人数超过了k# 则这个月只能完成需求人数多的工作nums[right],right左移if nums[left] + nums[right] > k:right -= 1# 如果两个工作所需人数超过了k# 则这个月可以同时完成nums[left]和nums[right]这两个工作,left右移、right左移else:left += 1right -= 1# 每轮匹配,都会多一个月来工作,更新ans变量ans += 1return ans# 二分查找
# 设置做左闭右开区间:
# 人力需求的最小值为nums数组中的最大值,
# 否则max(nums)这个工作无法在一个月内完成
# 人力需求的最大值为nums数组中的两个最大元素相加,
# 这里取一个更加宽松的上限sum(nums),考虑闭区间为sum(nums)+1
left, right = max(nums), sum(nums) + 1# 进行二分
while left < right:mid = left + (right - left) // 2# 如果在人力需求取mid时,所花费时间不超过m# 那么说明人力需求还有富余,right左移令搜索空间向左折半if check(mid, nums) <= m:right = mid# 如果在人力需求取mid时,所花费时间超过m# 那么说明人力需求有所紧缺,left右移令搜索空间向右折半else:left = mid + 1# 退出二分查找时,k = right = left是使得check(k, nums)恰好 ≤ m的第一个人力需求指
# 即为答案
print(left)

Java

import java.util.*;public class Main {public static int check(int k, List<Integer> nums) {int left = 0, right = nums.size() - 1, ans = 0;while (left <= right) {if (nums.get(left) + nums.get(right) > k) {right--;} else {left++;right--;}ans++;}return ans;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int m = scanner.nextInt();List<Integer> nums = new ArrayList<>();while (scanner.hasNextInt()) {nums.add(scanner.nextInt());}Collections.sort(nums);int left = Collections.max(nums);int right = nums.stream().mapToInt(Integer::intValue).sum() + 1;while (left < right) {int mid = left + (right - left) / 2;if (check(mid, nums) <= m) {right = mid;} else {left = mid + 1;}}System.out.println(left);}
}

C++

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>using namespace std;int check(int k, vector<int>& nums) {int left = 0, right = nums.size() - 1, ans = 0;while (left <= right) {if (nums[left] + nums[right] > k) {right--;} else {left++;right--;}ans++;}return ans;
}int main() {int m;cin >> m;vector<int> nums;int num;while (cin >> num) {nums.push_back(num);}sort(nums.begin(), nums.end());int left = *max_element(nums.begin(), nums.end());int right = accumulate(nums.begin(), nums.end(), 0) + 1;while (left < right) {int mid = left + (right - left) / 2;if (check(mid, nums) <= m) {right = mid;} else {left = mid + 1;}}cout << left << endl;return 0;
}

时空复杂度

时间复杂度:O(N(logN+logU))。排序所需的时间复杂度为O(NlogN)。单次check()函数所需时间复杂度为O(N),二分查找的范围区间为U = sum(nums) - max(nums),故总的二分查找所需时间复杂度为O(NlogU)

空间复杂度:O(1)。忽略排序所需编译栈空间,仅需若干常数变量。


华为OD算法/大厂面试高频题算法练习冲刺训练

  • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

  • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

  • 可查看链接 大厂真题汇总 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 od1336了解更多

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

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

相关文章

【已解决】MySQL:执行存储过程报错(MySQL字符集和排序方式冲突)

目录 问题现象&#xff1a; 问题分析&#xff1a; 解决方法&#xff1a; 拓展&#xff1a; 1、转换条件两边的字段或值为二进制数据&#xff1a; 2、转换条件两边的字段或值的字符集和排序方式&#xff1a; 3、修改列、表、库的字符集和排序方式 参考链接&#xff1a; 问…

spring webflux文件上传与下载

1、文件上传&#xff1a; Controller&#xff1a; PostMapping("/import")public void importImage(RequestPart("file") FilePart filePart) {imageService.importImage(filePart);}Service&#xff1a; public void importImage(FilePart filePart) {Fi…

java之arraylist的用法

java之arraylist的用法 Java中的ArrayList是一种基于动态数组实现的List接口。它允许使用索引访问和操作元素&#xff0c;并提供了高效的插入、查找和删除操作。 以下是关于Java ArrayList的详细用法介绍&#xff1a; 1&#xff09;创建ArrayList对象&#xff1a; List<S…

微信商城小程序怎么制作?做一个小程序需要什么流程?

小程序商城对商家有哪方面的帮助&#xff1f; 随着移动互联网的快速发展&#xff0c;小程序商城已经成为了越来越多商家的选择。那么&#xff0c;小程序商城到底对商家有哪些方面的帮助呢&#xff1f; 一、提高商家曝光度 在小程序平台上开设自己的小程序商城&#xff0c;可以…

AI之火是如何燎原的?始于马斯克与佩奇的一场激辩

丨划重点 ①在2015年, 马斯克44岁生日派对上&#xff0c;他与谷歌联合创始人佩奇曾就AI产生严重分歧&#xff0c;甚至终结了十多年的友谊。佩奇认为人类最终将与AI机器融合&#xff0c;将会有许多种智能争夺资源, 马斯克则担心机器可能会毁灭人类。 ②在收购AI创企DeepMind时…

acwing1209.带分数暴力与优化(java版)

//n a b / c n是确定的,只需找到其中两个。判断剩下一个数是否满足条件即可 //由题目条件可知,每个数不能重复使用,需要一个st全局数组判断每个数是否使用过 //递归实现排列型枚举,cn ac b //对于枚举出来的每一个a,再去枚举每一个c,再在c的枚举里判断b是否满足条件 //…

人工智能学习3(特征变换:特征数值化)

编译工具&#xff1a;PyCharm 有些编译工具不用写print可以直接将数据打印出来&#xff0c;pycharm需要写print才会打印出来。 文章目录 编译工具&#xff1a;PyCharm 概念1.特征类型分类型二值型顺序型数值型 2.特征数值化练习13.特征数值化练习24.特征二值化使用sklearn库自…

day69

今日回顾 Django与Ajax 一、什么是Ajax AJAX&#xff08;Asynchronous Javascript And XML&#xff09;翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互&#xff0c;传输的数据为XML&#xff08;当然&#xff0c;传输的数据不只是XML,现在…

YOLOv8优化策略:简单高效的模块-现代反向残差移动模块 (iRMB) | | ICCV2023 EMO

🚀🚀🚀本文改进:设计了一种面向移动端应用的简单而高效的现代反向残差移动模块 (Inverted Residual Mobile Block, iRMB),它吸收了类似 CNN 的效率来模拟短距离依赖和类似 Transformer 的动态建模能力来学习长距离交互,引入YOLOV8 🚀🚀🚀YOLOv8改进专栏:http:…

三个角度(握手、挥手、传输)优化TCP

TCP 三次握手的性能提升 客户端的优化 当客户端发起 SYN 包时&#xff0c;可以通过 tcp_syn_retries 控制其重传的次数。 服务端的优化 当服务端 SYN 半连接队列溢出后&#xff0c;会导致后续连接被丢弃&#xff0c;可以通过 netstat -s 观察半连接队列溢出的情况&#xff0c;如…

【Java GUI 窗体开发实践】基于抽象模板设计模式下实现Windows SSH连接Linux服务器

系列文章目录 文章目录 系列文章目录一、项目实现功能二、使用步骤1.引入抽象类模板2.子类实现具体业务一、项目实现功能 Java GUI 本地输入需要连接的虚拟机 ip地址、端口号、用户名和密码就可以连接上主机。 后续基于SFTP协议传输文件到虚拟机或者在虚拟机上的文件更改,本地…

对标Gen-2!Meta发布新模型进军文生视频赛道

随着扩散模型的飞速发展&#xff0c;诞生了Midjourney、DALLE 3、Stable Difusion等一大批出色的文生图模型。但在文生视频领域却进步缓慢&#xff0c;因为文生视频多数采用逐帧生成的方式,这类自回归方法运算效率低下、成本高。 即便使用先生成关键帧,再生成中间帧新方法。如…

在线客服系统有哪些?如何选择呢?

当我们谈论在线客服系统时&#xff0c;我们可能会面临着一系列的问题和疑惑&#xff0c;比如&#xff1a; 在线客服系统有哪些&#xff1f; 如何选择合适的在线客服系统&#xff1f; 首先&#xff0c;让我们看看目前市场上存在的在线客服系统。这些系统包括但不限于&#xff1a…

Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库

Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库 文章目录 Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库一、前言二、编译环境三、示例C/CPP程序1、总体工程结构2、示例代码3、CMakeLists.txt&#xff08;重要&#xff09;4、…

Python中删除文件和目录

python中分别提供os包下的os.remove()与shutil包下的shutil.rmtree()函数&#xff0c;其中os.remove(&#xff09;的主要作用是删除一个具体的文件&#xff0c;shutil.rmtree()主要作用是删除一个具体的目录。 os.remove() 这个函数需要一个参数&#xff0c;即要删除的文件的…

Python语言基础学习大纲(由某大模型生成)

自从上次经丙察察游了一次滇藏线&#xff0c;已有3个没写一篇了。今天利用由某大模型生成的上面这张思维导图&#xff0c;配合这个大模型生成的6000多字拼凑出一篇博文聊以交差。 Python语言概述 一、语言特点 1.语法简单明了 Python的语法简洁易懂&#xff0c;使得编写代码…

12.5作业

1. #include <iostream>using namespace std;class Animal { private:string name; public:Animal(){}Animal(string name):name(name){cout << "animal" << endl;}virtual void perfrom(){cout << "实现不同表演行为" << …

CEPH搭建

目录 一、概述 特点 1、统一存储 2、高扩展性 3、可靠性强 4、高性能 二、准备工作 1、关闭防火墙 2、关闭图形网络管理器 3、配置静态ip 4、关闭selinux 5、修改主机名 6、修改设置 7、ssh免密设置 8、hosts文件修改 9、时间同步 10、添加磁盘&#xff0c;并…

RepidJson将内容格式化后写入文件

以下是使用RapidJson将JSON内容格式化后写入文件的示例代码&#xff1a; #include <iostream> #include <fstream> #include <string> #include "rapidjson/document.h" #include "rapidjson/prettywriter.h" #include "rapidjson…

Windows下安装Git和Git小乌龟

目录 Git简介 Git安装 Git小乌龟简介 Git小乌龟安装 Git简介 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地进行从很小到非常大的项目的版本管理。Git支持将本地仓库与远程仓库进行关联&#xff0c;实现多人协作开发。由于具有分布式版本控制、高效性、灵…