2022-04-01:有n个人,m个任务,任务之间有依赖记录在int[][] depends里。 比如: depends[i] = [a, b],表示a任务依赖b任务的完成, 其中 0 <= a <
2022-04-01:有n个人,m个任务,任务之间有依赖记录在int[][] depends里。
比如: depends[i] = [a, b],表示a任务依赖b任务的完成,
其中 0 <= a < m,0 <= b < m,
1个人1天可以完成1个任务,每个人都会选当前能做任务里,标号最小的任务,
一个任务所依赖的任务都完成了,该任务才能开始做。
返回n个人做完m个任务,需要几天。
来自hulu。
答案2022-04-01:
拓扑排序。
代码用golang编写。代码如下:
package main
import (
"fmt"
"sort"
)
func main() {
depends := [][]int{{3, 0}, {4, 1}, {5, 2}, {4, 3}, {6, 5}, {7, 4}, {7, 6}}
ret := days(3, 8, depends)
fmt.Println(ret)
ret = days(2, 8, depends)
fmt.Println(ret)
}
func days(n, m int, depends [][]int) int {
if n < 1 {
return -1
}
if m <= 0 {
return 0
}
// nexts[0] = {1,4}
nexts := nexts(depends, m)
indegree := indegree(nexts, m)
// 工人队列!
workers := make([]int, 0)
for i := 0; i < n; i++ {
workers = append(workers, 0)
}
// zeroIn : 放着工作,放着可以开始做的工作,不能做的任务,不在其中
// 小根堆:标号小的任务,一定要先做!
zeroIn := make([]int, 0)
for i := 0; i < m; i++ {
if indegree[i] == 0 {
zeroIn = append(zeroIn, i)
}
}
// start[i] :i之前必须完成的任务,占了几天,导致i任务只能从那天开始!
start := make([]int, m)
// 完成所有任务的最大天数
finishAll := 0
done := 0
for len(zeroIn) > 0 { // 有任务可做
// 当前可以做的任务中,标号最小的任务
sort.Ints(zeroIn)
job := zeroIn[0]
zeroIn = zeroIn[1:]
// 当前可用的工人里,最早醒的!
sort.Ints(workers)
wake := workers[0]
workers = workers[1:]
// job 何时完成呢?
// (工人醒来,开工时间)最晚的!+1
finish := getMax(start[job], wake) + 1
finishAll = getMax(finishAll, finish)
done++
// 消除影响
for _, next := range nexts[job] {
start[next] = getMax(start[next], finish)
indegree[next]--
if indegree[next] == 0 {
zeroIn = append(zeroIn, next)
}
}
workers = append(workers, finish)
}
if done == m {
return finishAll
} else {
return -1
}
}
func getMax(a, b int) int {
if a > b {
return a
} else {
return b
}
}
func nexts(depends [][]int, m int) [][]int {
//Arrays.sort(depends, (a, b) -> a[1] - b[1]);
sort.Slice(depends, func(i, j int) bool {
a := depends[i]
b := depends[j]
return a[1] < b[1]
})
n := len(depends)
//int[][] nexts = new int[m][0];
nexts := make([][]int, m)
for i := 0; i < m; i++ {
nexts[i] = make([]int, 0)
}
if n == 0 {
return nexts
}
size := 1
for i := 1; i < n; i++ {
if depends[i-1][1] != depends[i][1] {
from := depends[i-1][1]
nexts[from] = make([]int, size)
for k, j := 0, i-size; k < size; k, j = k+1, j+1 {
nexts[from][k] = depends[j][0]
}
size = 1
} else {
size++
}
}
from := depends[n-1][1]
nexts[from] = make([]int, size)
for k, j := 0, n-size; k < size; k, j = k+1, j+1 {
nexts[from][k] = depends[j][0]
}
return nexts
}
func indegree(nexts [][]int, m int) []int {
indegree := make([]int, m)
for i := 0; i < m; i++ {
for j := 0; j < len(nexts[i]); j++ {
indegree[nexts[i][j]]++
}
}
return indegree
}
执行结果如下:

2022-04-01:有n个人,m个任务,任务之间有依赖记录在int[][] depends里。 比如: depends[i] = [a, b],表示a任务依赖b任务的完成, 其中 0 <= a <的更多相关文章
- ok6410 u-boot-2012.04.01移植六完善MLC NAND支持
继ok6410 u-boot-2012.04.01移植四.五后,开发板基本已支持MLC NAND,支持DM9000.但是通过NAND命令更新u-boot到NAND,还存在问题,需要根据u-boot的n ...
- ok6410 u-boot-2012.04.01移植七完善u-boot移植(u-boot移植结束)
继ok6410 u-boot-2012.04.01移植六后,开发板已支持MLC NAND.DM9000等.但还需要完善比如环境变量.mtdpart分区.裁剪.制作补丁等.下面的工作就是完善移植的u-b ...
- ok6410 u-boot-2012.04.01移植二修改源码支持单板
继ok6410 u-boot-2012.04.01移植一后修改代码,对ok6410单板初始化,主要包括时钟.串口.NAND.DDR等初始化.这些工作在以前的裸板程序都写了,直接拿来用.我觉得先写裸板程 ...
- 移植u-boot.2012.04.01
/*************************************************** *u-boot版本:u-boot2012.04.01 *gcc版本:arm-linux-gcc ...
- ok6410 u-boot-2012.04.01移植五支持DM9000
继ok6410 u-boot-2012.04.01移植四后,开发板基本已支持MLC NAND,但还有一些细节地方修改,这节增加DM9000支持,通过网卡tftp程序到内存,接着通过NAND命令写到NA ...
- 移植u-boot-2012.04.01到JZ2440
开发环境:Ubuntu 12.04 开发板:JZ2440 256M NandFlash 64M SDRAM 交叉编译器:arm-linux-gcc-4.3.2 u-boot:u-boot-2012 ...
- uboot-2012.04.01移植编译前准备
一:准备移植1.从下面的官网下载uboot-2012.04.012.建立sourceinsight工程 a.解压并在E:\colin weidongshan\transplant_u-boot-201 ...
- Linux学习 :移植U-boot_2012.04.01到JZ2440开发板
一.下载U-boot源码:ftp://ftp.denx.de/pub/u-boot/ 二.uboot的启动过程: 部分硬件初始化——>加载完整uboot到RAM——>跳转到第二阶段入口开始 ...
- z-index总结【转载http://www.cnblogs.com/mind/archive/2012/04/01/2198995.html】
元素位置重叠的背景常识 (x)html文档中的元素默认处于普通流(normal flow)中,也就是说其顺序由元素在文档中的先后位置决定,此时一般不会产生重叠(但指定负边距可能产生重叠).当我们用cs ...
- ubuntu(16.04.01)学习-day1
1.修改root用户密码 sudo passwd root 按提示进行设置. 2.从Ubuntu 16.04开始,用户可以实现改变启动器的位置,可以将启动器移到屏幕底部,但是无法移到右边或顶部.打开终 ...
随机推荐
- nios flash programer固化后不能运行
针对我的这个工程D:\works\FROM_COMP\8050\software\FPGA\MC8050_EP4CE15,出现的问题是nios eds 运行正常,有打印输出,有LED闪烁.但是flas ...
- 使用Wireshark查看HTTPS中TLS握手过程
通过使用Wireshark抓包分析TLS握手的过程,可以更容易理解和验证TLS协议,本文将先介绍Wireshark解密HTTPS流量的方法,然后分别验证TLS握手过程和TLS会话恢复的过程. 一.使用 ...
- springboot格式化timestamp时间
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
- 【译】使用 ChatGPT 和 Azure Cosmos DB 构建智能应用程序
原文 | Mark Brown 翻译 | 郑子铭 随着对智能应用程序的需求不断增长,开发人员越来越多地转向人工智能(AI)和机器学习(ML),以增强其应用程序的功能.聊天机器人已经成为提供对话式人工智 ...
- 面试突击:MVCC 和间隙锁有什么区别?
MVCC 和间隙锁是两种完全不同的机制,但它们的目的都是相同的,都是用来保证数据库并发访问的,我们先来看二者的定义. MVCC 定义 MVCC 是多版本并发控制(Multi-Version Concu ...
- 人工智能机器学习底层原理剖析,人造神经元,您一定能看懂,通俗解释把AI“黑话”转化为“白话文”
按照固有思维方式,人们总以为人工智能是一个莫测高深的行业,这个行业的人都是高智商人群,无论是写文章还是和人讲话,总是讳莫如深,接着就是蹦出一些"高级"词汇,什么"神经网络 ...
- 使用golang+antlr4构建一个自己的语言解析器(完结篇)
Goland 中Antlr4插件 在goland中安装Antlr4插件,用于识别输入的字符在在语法文件中生成的语法树的样子,大概就是如下的摸样 下载步骤: 1.点击文件中的设置选项 2.在插件目录下输 ...
- 基于开源的 ChatGPT Web UI 项目,快速构建属于自己的 ChatGPT 站点
作为一个技术博主,了不起比较喜欢各种折腾,之前给大家介绍过 ChatGPT 接入微信,钉钉和知识星球(如果没看过的可以翻翻前面的文章),最近再看开源项目的时候,发现了一个 ChatGPT Web UI ...
- CommunityToolkit.Mvvm8.1 viewmodel使用-旧式写法(2)
本系列文章导航 https://www.cnblogs.com/aierong/category/2297596.html 0.说明 CommunityToolkit.Mvvm8.1有一个重大更新的功 ...
- day48:django前戏:HTTP协议&自定义web框架
目录 1.HTTP协议 1.HTTP协议简介 2.HTTP协议概述 3.HTTP协议工作原理 4.HTTP协议请求方法 5.HTTP协议状态码 6.URL 7.HTTP请求格式 8.HTTP响应格式 ...