【华为OD机试真题 C语言】426、部门人力分配 | 机试真题+思路参考+代码解析(C卷)
一、题目
🎃题目描述
部门在进行需求开发时需要进行人力安排。当前部门需要完成 N 个需求,需求用 requirements表示,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。这部分需求需要在 M 个月内完成开发,进行人力安排后每个月的人力是固定的。 目前要求每个月最多有 2 个需求开发,并且每个月需要完成的需求不能超过部门人力。请帮部门评估在满足需求开发进度的情况下, 每个月需要的最小人力是多少?
🎃输入输出
输入 输入第一行为 M ,M 表示需要开发时间要求 输入第二行为 requirements ,requirements 表示每个需求工作量大小,N为requirements 长度 输出 输出部门需要人力需求
🎃样例1
输入
3
3 5 3 4
输出
6
说明:
第一行输入数据 3 表示开发时间要求,第二行输入数据表示需求工作量大小,输出数据一行,表示部门人力需求。
当选择人力为6时,2个需求量为3的工作可以在1个月里完成,其他2个工作各需要1个月完成。可以在3个月内完成所有需求。
当选择人力为5时,4个工作各需要1个月完成,一共需要4个月才能完成所有需求。
因此6是部门最小的人力需求。
🎃样例2
输入
1
3 6
输出
9
🎃样例3
输入
3
3 5 3 2
输出
5
🎃样例4
输入
3
2 7 1 8 2 8
输出
10
🎃样例5
输入
6
3 1 4 1 5 9
输出
9
🎃样例6
输入
4
1 2 3 4 5 6 7 8
输出
9
🎃样例7
输入
5
1 2 3 4 5 6
输出
6
🎃样例8
输入
4
8 9 10 11
输出
11
🎃样例9
输入
7
50 30 50 30 50 30 50
输出
50
🎃样例10
输入
4
2 2 2 2
输出
2
🎃样例11
输入
8
8 8 8 8 8 8 9
输出
9
二、思路参考
这个题目跟423题很类似。【华为OD机试真题 C语言】423、项目排期 、最快完成所有工作的天数 | 机试真题+思路参考+代码解析(C卷)
使用类似的思路可解,虽然题目中说明 “目前要求每个月最多有 2 个需求开发” 但是在输入 M * 2 < N 的测试用例下,都可以通过。
三、实现参考
func minWorkers(workloads []int, index int, mLoads []int, ans *int) {
if index == len(workloads) {
total := 0
for _, l := range mLoads {
if l > total {
total = l
}
}
if *ans > total {
*ans = total
}
return
}
for i, _ := range mLoads {
if mLoads[i]+workloads[index] > *ans {
continue
}
mLoads[i] += workloads[index]
minWorkers(workloads, index+1, mLoads, ans)
mLoads[i] -= workloads[index]
}
}
func Test426(t *testing.T) {
cases := []struct {
workloads []int
month int
want int
}{
{
[]int{3, 6},
1,
9,
},
{
[]int{3, 5, 3, 2},
3,
5,
},
{
[]int{2, 7, 1, 8, 2, 8},
3,
10,
},
{
[]int{3, 1, 4, 1, 5, 9},
6,
9,
},
{
[]int{1, 2, 3, 4, 5, 6, 7, 8},
4,
9,
},
{[]int{1, 2, 3, 4, 5, 6},
5,
6,
},
{[]int{8, 9, 10, 11},
4,
11,
},
{[]int{50, 30, 50, 30, 50, 30, 50},
7,
50,
},
{[]int{2, 2, 2, 2},
4,
2,
},
{[]int{8, 8, 8, 8, 8, 8, 9},
8,
9,
},
}
for idx, c := range cases {
ans := math.MaxInt
m := make([]int, c.month)
if minWorkers(c.workloads, 0, m, &ans); ans != c.want {
t.Logf("case %d: want %d, got %d", idx, c.want, ans)
}
}
}