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开始,用户可以实现改变启动器的位置,可以将启动器移到屏幕底部,但是无法移到右边或顶部.打开终 ...
随机推荐
- MySql数据库的两大引擎InnoDB和MyIsam的区别
事务方面 InnoDB支持事务,MyISAM不支持事务.MySql的默认存储引擎为InnoDB 外键方面 InnoDB支持外键,MyISAM不支持,对一个包含外键的InnoDB表转为MYISAM会失败 ...
- ElseViewer--校稿
1Edit ModeThis presents the proof in continuous scroll to review and make corrections. By default, y ...
- mysql 不包含某个字符
转载网址: https://blog.csdn.net/mp624183768/article/details/121696040?utm_medium=distribute.pc_relevant. ...
- 从开源模型、框架到自研,声网 Web 端虚拟背景算法正式发布
根据研究发现,在平均 38 分钟的视频会议里面,大概会有 13 分钟左右的时间用于处理和干扰相关的事情.同时研究也表明在参加在线会议的时候,人们更加倾向于语音会议,其中一个关键原因就是大家不希望个人隐 ...
- RTC月度小报6月丨编程挑战赛圆满收官;声网上市1周年回顾...
本月亮点速览 产品与技术: 声网Agora 实时音视频服务正式上线 HTC VIVE Sync App,支持非 VR 用户 「灵动课堂」发布 1.1.2 版本 「互动直播」6 月共发布两个版,最新版本 ...
- java多线程--5 同步方法和同步块synchronized
java多线程--5 同步方法和同步块synchronized 同步方法和同步块 同步方法:关键字synchronized,包括synchronized方法和synchronized块 public ...
- golang pprof 监控系列(1) —— go trace 统计原理与使用
golang pprof 监控系列(1) -- go trace 统计原理与使用 服务监控系列文章 服务监控系列视频 关于go tool trace的使用,网上有相当多的资料,但拿我之前初学golan ...
- Python 中 is 和 == 的区别
is 和 == 的区别 相信学过 Python 小伙伴们都知道 is 和 == 都是用来比较 Python 对象的,但是区别就是 is 比较需要对象的值和内存地址都相等 == 比较只需要对象的值相等就 ...
- pythonz之time库常用方法
ime.time() 获取当前时间戳.time.ctime() 当前时间的字符串形式.time.localtime() 当前时间的 struct_time 形式.time.strftime() 用来获 ...
- MQTT(EMQX) - SpringBoot 整合MQTT 连接池 Demo - 附源代码 + 在线客服聊天架构图
MQTT(EMQX) - Linux CentOS Docker 安装 MQTT 概述 MQTT (Message Queue Telemetry Transport) 是一个轻量级传输协议,它被设计 ...