华为机试真题 Python 实现最大化控制资源成本2022.11 Q4 新题
Posted MISAYAONE
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为机试真题 Python 实现最大化控制资源成本2022.11 Q4 新题相关的知识,希望对你有一定的参考价值。
目录
题目
公司创新实验室正在研究如何最小化资源成本,最大化资源利用率,请你设计算法帮他们解决一个任务混部问题:有taskNum项任务,每个任务有开始时间(startTime),结束时间(endTime),并行度(parallelism)三个属性,并行度是指这个任务运行时将会占用的服务器数量,一个服务器在每个时刻可以被任意任务使用但最多被一个任务占用,任务运行完成立即释放(结束时刻不占用)。任务混部问题是指给定一批任务,让这批任务由同一批服务器承载运行,请你计算完成这批任务混部最少需要多少服务器,从而最大最大化控制资源成本。
输入描述:
第一行输入为taskNum,表示有taskNum项任务
接下来taskNum行,每行三个整数,表示每个任务的开始时间
(startTime ),结束时间(endTime ),并行度(parallelism)输出描述:
一个整数,表示最少需要的服务器数量示例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个服务器。备注:
1<=taskNum<=100000
0<=startTime<endTime<=50000
1<=parallelism<=100
思路
1:题目与第56题【区间交集】非常相似。大致思路应该是不断的递归对区间求交集,求得交集之后将占用机器数相加,直到没有交集为止。
2:举一个比较长的例子:
4
0 5 1
2 3 14 7 3
6 9 2排序后区间为:[0,5] [2,3] [4,7] [6,9]
第一轮两两之间求交集:
[0,5] 和 [2,3] 交集为[2,3] 机器数相加为2
[0,5] 和 [4,7] 交集为[4,5] 机器数相加为4
[0,5] 和 [6,9] 无交集
[2,3] 和 [4,5] 无交集
[2,3] 和 [6,9] 无交集
[4,7] 和[6,9] 交集为[6,7] 机器数相加为5
第二轮两两之间求交集:
[2,3] [4,5] [6,7] 两两之间都没有交集,因此最多的机器数为5。
考点
1:数据结构
2:递归法
Code
# coding:utf-8
import functools
max_machine = 0
#处理输入
task_num = input()
i = int(task_num)
ranges = []
while(i>0):
input_str = input()
input_list = [int(x) for x in input_str.split(" ")]
ranges.append(input_list)
i=i-1
#自定义排序函数,a,b为两个list
def comp(a, b):
if (a[0] > b[0]):
return 1
elif (a[0] == b[0]):
if (a[1] > b[1]):
return 1
elif (a[1] == b[1]):
return 0
return -1
#求公共区间
def cal_public_range(ranges):
global max_machine
ranges = sorted(ranges, key=functools.cmp_to_key(comp))
public_range = []
for i in range(len(ranges)):
for j in range(i+1, len(ranges)):
left = max(ranges[i][0], ranges[j][0])
right = min(ranges[i][1], ranges[j][1])
if (left <= right):
temp = []
temp.append(left)
temp.append(right)
temp.append(ranges[i][2] + ranges[j][2]);
public_range.append(temp)
if (ranges[i][2] + ranges[j][2] > max_machine):
max_machine = ranges[i][2] + ranges[j][2]
return public_range
while(len(ranges) > 1):
ranges = cal_public_range(ranges);
print (max_machine)
以上是关于华为机试真题 Python 实现最大化控制资源成本2022.11 Q4 新题的主要内容,如果未能解决你的问题,请参考以下文章
华为机试真题 C++ 实现最大化控制资源成本2022.11 Q4 新题
华为机试真题 java 实现最大化控制资源成本2022.11 Q4 新题