首页 > 编程语言 >1020. 【软件认证】任务调度算法

1020. 【软件认证】任务调度算法

时间:2023-10-31 21:44:06浏览次数:34  
标签:1020 taskNum int 任务 timeList 算法 key resList 任务调度

题目描述
某分布式任务调度系统有 taskNum 个任务(编号从 1 到 taskNum)需要调度,调度策略:

任务之间可能存在依赖关系,且无循环依赖,如任务1 依赖任务2,那么要等待任务2执行完才能执行任务1;
如果任务之间没有依赖关系,则可以并发执行(假设并发所需资源是充足的)。
现给出任务间的依赖关系,并假设每个任务的执行时间恒为 1 分钟,请计算执行完这 taskNum 个任务所需的最短时间(单位分钟)。

解答要求
时间限制:2000ms, 内存限制:256MB
输入
第一行为任务的数量 taskNum ,其值范围为:[1, 1000]
第二行为依赖关系的数量 relationsNum ,其值范围:[0, 500000]
接下来 relationsNum 行,每行描述一个依赖关系,格式为 IDi>IDj,表示任务 i 依赖任务 j ,IDi 和 IDj 值的范围为:[1, taskNum]

输出
一个整数,代表执行完所有任务的最短时间。

样例
输入样例 1 复制

3
1
1>2
输出样例 1

2
提示样例 1
总共三个任务,任务1依赖任务2,任务2、任务3可以并发执行,最后执行任务1,最短时间为2分钟。

输入样例 2 复制

9
6
1>2
2>3
2>4
4>5
6>4
8>7
输出样例 2

4
提示样例 2

/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
 * Description: 上机编程认证
 * Note: 缺省代码仅供参考,可自行决定使用、修改或删除
 * 只能import Go标准库
 */
package main

import (
	"fmt"
)

// 待实现函数,在此函数中填入答题代码
func getMinTime(taskNum int, relations [][]int) int {
	var timeList = make([][]int, taskNum+1)
	for _, r := range relations {
		sub := r[0]
		master := r[1]
		timeList[sub] = append(timeList[sub], master)
	}
	var resList = make(map[int]int)
	var res int
	for sub := range timeList {
		if sub == 0 {
			continue
		}
		temp := getTaskTime(timeList, sub, resList)
		if temp > res {
			res = temp
		}
	}
	return res
}

func getTaskTime(timeList [][]int, key int, resList map[int]int) int {
	// 已经计算过,不用再计算了
	if resList[key] != 0 {
		return resList[key]
	}
	if len(timeList[key]) == 0 {
		resList[key] = 1
		return 1
	}
	for _, master := range timeList[key] {
		resTemp := getTaskTime(timeList, master, resList)
		if resTemp > resList[key] {
			resList[key] = resTemp
		}
	}
	resList[key] = resList[key] + 1
	return resList[key]
}

func main() {
	taskNum := 9
	relations := [][]int{{1, 2}, {2, 3}, {2, 4}, {4, 5}, {6, 4}, {8, 7}}
	result := getMinTime(taskNum, relations)
	fmt.Println(result)
}

标签:1020,taskNum,int,任务,timeList,算法,key,resList,任务调度
From: https://www.cnblogs.com/gongxianjin/p/17801640.html

相关文章

  • 二分查找算法题1
    /***https://leetcode.cn/problems/sqrtx/description/*二分查找*将数据分成两部分*第一部分为平方小于等于target*另外的为大于target*left=mid。right=mid-1;使用+1求中**/publicstaticvoidhanShu19(intx){......
  • 【算法题】2826. 将三个组排序
    题目:给你一个下标从0开始长度为n的整数数组nums。从0到n-1的数字被分为编号从1到3的三个组,数字i属于组nums[i]。注意,有的组可能是空的。你可以执行以下操作任意次:选择数字x并改变它的组。更正式的,你可以将nums[x]改为数字1到3中的任意一个。你将按......
  • 【算法题】2788. 按分隔符拆分字符串
    题目:给你一个字符串数组words和一个字符separator,请你按separator拆分words中的每个字符串。返回一个由拆分后的新字符串组成的字符串数组,不包括空字符串。注意separator用于决定拆分发生的位置,但它不包含在结果字符串中。拆分可能形成两个以上的字符串。结果字符串必......
  • 【算法题】2765. 最长交替子序列
    题目:给你一个下标从0开始的整数数组nums。如果nums中长度为m的子数组s满足以下条件,我们称它是一个交替子序列:m大于1。s1=s0+1。下标从0开始的子数组s与数组[s0,s1,s0,s1,…,s(m-1)%2]一样。也就是说,s1-s0=1,s2-s1=-1,s3-s2=1,s4-s3......
  • 【算法题】2769. 找出最大的可达成数字
    题目:给你两个整数num和t。如果整数x可以在执行下述操作不超过t次的情况下变为与num相等,则称其为可达成数字:每次操作将x的值增加或减少1,同时可以选择将num的值增加或减少1。返回所有可达成数字中的最大值。可以证明至少存在一个可达成数字。示例1:输入:num=4,......
  • 【算法题】2817. 限制条件下元素之间的最小绝对差
    题目:给你一个下标从0开始的整数数组nums和一个整数x。请你找到数组中下标距离至少为x的两个元素的差值绝对值的最小值。换言之,请你找到两个下标i和j,满足abs(i-j)>=x且abs(nums[i]-nums[j])的值最小。请你返回一个整数,表示下标距离至少为x的两个元素之......
  • 【算法题】7004. 判别首字母缩略词
    题目:给你一个字符串数组words和一个字符串s,请你判断s是不是words的首字母缩略词。如果可以按顺序串联words中每个字符串的第一个字符形成字符串s,则认为s是words的首字母缩略词。例如,“ab”可以由[“apple”,“banana”]形成,但是无法从[“bear”,“aardvark......
  • 10.31算法
    最长回文子串给你一个字符串s,找到s中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例1:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答案。示例2:输入:s="cbbd"输出:"bb"class Solution {public:    string longes......
  • 【NO.98】LeetCode HOT 100—621. 任务调度器
    题目:621.任务调度器给你一个用字符数组tasks表示的CPU需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在1个单位时间内执行完。在任何一个单位时间,CPU可以完成一个任务,或者处于待命状态。然而,两个相同种类的任务之间......
  • R语言非参数方法:使用核方法和K-NN(k近邻算法)分类预测心脏病数据|附代码数据
    原文链接: http://tecdat.cn/?p=22181 原文出处:拓端数据部落公众号 最近我们被客户要求撰写关于非参数方法的研究报告,包括一些图形和统计输出。本文考虑一下基于核方法进行分类预测。注意,在这里,我们不使用标准逻辑回归,它是参数模型。非参数方法用于函数估计的非参数方法大......