(C语言)华为OD机考:统一考试 C卷 + D卷 + B卷 +A卷
目前在考C卷,经过两个月的收集整理,C卷真题已整理完毕
抽到原题的概率为2/3到3/3,也就是最少抽到两道原题。请注意:大家刷完C卷真题,最好要把B卷的真题刷一下,因为C卷的部分真题来自B卷。
真题目录:【C语言题解版】华为 OD 机试 C卷抽中题库清单(全真题库)含考点说明
专栏:(C语言)最新华为OD机试C卷+D卷+AB卷
题目描述
项目组共有N个开发人员,项目经理接到了M个独立的需求,每个需求的工作量不同,且每个需求只能由一个开发人员独立完成,不能多人合作。假定各个需求直接无任何先后依赖关系,请设计算法帮助项目经理进行工作安排,使整个项目能用最少的时间交付。
输入描述
第一行输入为M个需求的工作量,单位为天,用逗号隔开。
例如:X1 X2 X3 … Xm 。表示共有M个需求,每个需求的工作量分别为X1天,X2天…Xm天。
其中0<M<30;0<Xm<200
第二行输入为项目组人员数量N
输出描述
最快完成所有工作的天数
用例
输入:
6 2 7 7 9 3 2 1 3 11 4
2
输出:
28
说明:
共有两位员工,其中一位分配需求 6 2 7 7 3 2 1共需要28天完成,另一位分配需求 9 3 11 4 共需要27天完成,故完成所有工作至少需要28天。
解题思路
给定一系列任务的工作量和一定数量的工人,计算完成所有任务所需的最少天数,使得每个工人分配到的任务总工作量不超过这个天数。这是一个典型的搜索问题,可以通过回溯法和二分查找结合来解决。
-
排序和反转任务数组:
- 使用
Arrays.sort(tasks)
对任务数组进行升序排序,然后通过一个循环将数组反转,使其成为降序。这样做是为了优先分配工作量大的任务,从而更高效地利用工人的工作时间。
- 使用
-
二分查找:
- 为了找到完成所有任务所需的最少天数,使用二分查找确定这个最小值。设置两个指针
l
和r
,分别表示可能的最短时间的下界和上界。l
初始化为数组中的最大值(即最大的单个任务工作
- 为了找到完成所有任务所需的最少天数,使用二分查找确定这个最小值。设置两个指针