当前位置: 首页 > 面试经验 >

【华为OD机试2023】任务混部Python

优质
小牛编辑
120浏览
2023-03-28

【华为OD机试2023】任务混部Python

题目描述:

公司创新实验室正在研究如何最小化资源成本,最大化资源利用率,请你设计算法帮他们解决一个任务混部问题:有taskNum项任务,每个任务有开始时间(startTime ),结束时间(endTime),并行度(parallelism)三个属性,并行度是指这个任务运行时将会占用的服务器数量,一个服务器在每个时刻可以被任意任务使用但最多被一个任务占用,任务运行完会立即释放(结束时刻不占用)。任务混部问题是指给定一批任务,让这批任务由同一批服务器承载运行,请你计算完成这批任务混部最少需要多少服务器,从而最大化控制资源成本。

输入描述:

第一行输入为taskNum,表示有taskNum项任务

接下来taskNum行,每行三个整数,表示每个任务的开始时间(startTime ),结束时间(endTime),并行度(parallelism)

输出描述:

一个整数,表示最少需要的服务器数量

补充说明:

1<=taskNum<=100000

0<=startTime<endTime<=50000

1=<parallelism<=100

示例1

输入:

3

2 3 1

6 9 2

0 5 1

输出:

2

说明:

一共有三个任务,第一个任务在时间区间[2,3)运行,占用1个服务器,第二个任务在时间区间[6,9)运行,占用2个服务器,第三个任务在时间区间[0,5)运行,占用1个服务器,需要最多服务器的时间区间为[2,3)和[6,9),需要2个服务器。

示例2

输入:

2

3 9 2

4 7 3

输出:

5

说明:

一共有两个任务,第一个任务在时间区间[3,9)运行,占用2个服务器,第二个任务在时间区间[4,7)运行,占用3个服务器,需要最多服务器的时间区间为[4,7),需要5个服务器。

解题思路:

这道题的意思就是求所有任务时间区间内,任意一个时刻需要使用的服务器数量最大为多少,关键就在于如何设定这个时刻,我原本是打算找出所有区间左端的最小值,右端的最大值,对其进行遍历的,但感觉这样时间复杂度太高了。

然后从其他大佬那边得到了一个思路,可以选定每一个任务开始的时刻,作为计算服务器需求的时刻。因为在这个时刻,是供和需一定会发生变化的时刻,且决定了接下来一段时间的需。

理清了思路,代码就很简单了


taskNum=int(input())
tasks=sorted([list(map(int,input().split())) for i in range(taskNum)],key=lambda x:(x[0],x[1]))
startTimes=[task[0] for task in tasks]
max_need=0
for startTime in startTimes:
count=0
for task in tasks:
if task[0]<=startTime<task[1]:
count+=task[2]
max_need=max(max_need,count)
print(max_need)

 类似资料: