华为机试真题 Python 实现最大化控制资源成本2022.11 Q4 新题

Posted MISAYAONE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为机试真题 Python 实现最大化控制资源成本2022.11 Q4 新题相关的知识,希望对你有一定的参考价值。

目录

题目

思路

考点

Code


题目

公司创新实验室正在研究如何最小化资源成本,最大化资源利用率,请你设计算法帮他们解决一个任务混部问题:有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 1

4 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 新题

华为机试真题 java 实现最大化控制资源成本2022.11 Q4 新题

华为机试(Python)真题Od

华为机试(JAVA)真题Od

华为机试(JAVA)真题Od