【华为OD机试真题 python】任务最优调度 【2021 H2, 2022 Q1,Q2 考试题】

 题目描述

给定一个正整数组表示待系统执行的任务列表,数组的每一个元素代表一个任务,元素的值表示该任务的类型。

请计算执行完所有任务所需的最短时间。

任务执行规则如下:

  1. 任务可以按任意顺序执行,且每个任务执行耗时间均为1个时间单位。
  2. 两个同类型的任务之间必须有长度为N个单位的冷却时间,比如N为2时,在时间K执行了类型3的任务,那么K+1和K+2两个时间不能执行类型3任务。
  3. 系统在任何一个单位时间内都可以执行一个任务,或者等待状态。

说明:数组最大长度为1000,速度最大值1000。

输入描述

  • 第一行记录一个用半角逗号分隔的数组,数组长度不超过1000,数组元素的值不超过1000,
  • 第二行记录任务冷却时间,N为正整数,N<=100。

输出描述

  • 输出为执行完所有任务所需的最短时间。

示例1  输入输出示例仅供调试,后台判题数据一般不包含示例

输入

2,2,2,3

2

输出

7

说明

时间1:执行类型2任务。
时间2:执行类型3的任务(因为冷却时间为2,所以时间2不能执行类型2的任务)。
时间3:系统等待(仍然在类型2的冷却时间)。
时间4:执行类型2任务。
时间5:系统等待。
时间6:系统等待。
时间7:执行类型2任务。
因此总共耗时7。

"""思路
    1. 给每个任务的初始cd 赋值为0 组成字典
    2. 判断任务是否全部完成,完成就退出循环,否则继续执行
    3. 如果任务不在完成列表且任务cd为0则添加任务进入完成列表,字典中该任务冷却时间为cd+1并且将cd-1(进行任务本身也需要一个时间单位加上冷却时间所以此时完成任务后直接减去完成自身所欲需要的时间单位)执行完直接跳出当前循环
    4. 判断是否有任务 cd为0,如果有则将任务字典中所有的cd-1 再判断是否有任务全部完成,如果任务列表中有任务已经全部完成,那么任务字典删除此任务.防止过度遍历
    """



task_ls = input().split(",")
cd = int(input())
task_and_cd = {}
unfinished_num = [i for i in range(len(task_ls))]
finished_num = []
all_times = []


def judge(dic):
    ls = list(dic.values())
    if 0 not in ls:
        return True
    else:
        return False


for i in task_ls:
    task_and_cd[i] = 0
while True:
    if len(finished_num) == len(task_ls):
        break
    for num in unfinished_num:
        try:
            if task_and_cd[task_ls[num]] == 0 and num not in finished_num:
                task_and_cd[task_ls[num]] += cd + 1
                finished_num.append(num)
                all_times.append(task_ls[num])
                for s in task_and_cd.keys():
                    if task_and_cd[s] != 0:
                        task_and_cd[s] = task_and_cd[s] - 1
                continue
            elif judge(task_and_cd):
                all_times.append(" ")
                for s in task_and_cd.keys():
                    if task_and_cd[s] != 0:
                        task_and_cd[s] = task_and_cd[s] - 1
            elif task_ls.count(task_ls[num]) == all_times.count(task_ls[num]):
                del task_and_cd[task_ls[num]]
            else:
                continue
        except:
            continue
print(len(all_times))

你可能感兴趣的:(华为2022od真题,python,数据结构,python,算法,华为,开发语言)