「 【华为OD机试真题 Go语言实现】426、部门人力分配 | 机试真题+思路参考+代码解析(C卷)」2024年7月5日

【华为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)
		}
	}
}

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值