题目描述
现在有n个容器服务,服务的启动可能有一定的依赖性(有些服务启动没有依赖),其次服务自身启动加载会消耗一些时间。
给你一个 n x n 的二维矩阵useTime,其中
- useTime[i][i]=10 表示服务i自身启动加载需要消耗10s
- useTime[i][j] = 1 表示服务i启动依赖服务j启动完成
- useTime[i][k]=0 表示服务i启动不依赖服务k
其实 0<= i,j,k < n。
服务之间启动没有循环依赖(不会出现环),若想对任意一个服务i进行集成测试(服务i自身也需要加载),求最少需要等待多少时间。
输入描述
第一行输入服务总量 n,
之后的 n 行表示服务启动的依赖关系以及自身启动加载耗时
最后输入 k 表示计算需要等待多少时间后可以对服务 k 进行集成测试
其中 1 <= k <=n,1<=n<=100
输出描述
最少需要等待多少时间(s)后可以对服务 k 进行集成测试
用例
输入 | 3 5 0 0 1 5 0 0 1 5 3 |
输出 | 15 |
说明 | 服务3启动依赖服务2,服务2启动依赖服务1,由于服务1,2,3自身加载需要消耗5s,所以5+5+5=15,需要等待15s后可以对服务3进行集成测试 |
输入 | 3 5 0 0 1 10 1 1 0 11 2 |
输出 | 26 |
说明 | 服务2启动依赖服务1和服务3,服务3启动需要依赖服务1,服务1,2,3自身加载需要消耗5s,10s,11s,所以5+10+11=26s,需要等待26s后可以对服务2进行集成测试。 |
输入 | 4 2 0 0 0 0 3 0 0 1 1 4 0 1 1 1 5 4 |
输出 | 12 |
说明 | 服务3启动依赖服务1和服务2,服务4启动需要依赖服务1,2,3,服务1,2,3自身加载需要消耗2s,3s,4s,5s,所以3+4+5=12s(因为服务1和服务2可以同时启动),要等待12s后可以对服务4进行集成测试。 |
输入 | 5 1 0 0 0 0 0 2 0 0 0 1 1 3 0 0 1 1 0 4 0 0 0 1 1 5 5 |
输出 | 11 |
说明 | 服务3启动依赖服务1和服务2,服务4启动需要依赖服务1,2,服务5启动需要依赖服务3,5,服务1,2,3,4,5自身加载需要消耗1s,2s,3s,4s,5s,所以2+4+5=11s(因为服务1和服务2可以同时启动,服务3和服务4可以同时启动),要等待11s后可以对服务5进行集成测试。 |
题目解析
本题看上去很像拓扑排序,但是拓扑排序并不是解决本题的最佳方案。
本题最佳解题思路是,利用递归,求解要求的服务点的启动时间,具体思路如下:
比如用例3图示如下:
现在要求解服务4的启动时间,其实就是:
服务4的启动时间 = max(服务1启动时间, 服务2启动时间, 服务3启动时间) + 本身启动时间
其中,服务1,服务2没有前置服务,因此他们的启动时间就是本身启动时间。
而,服务3有前置服务,因此服务3的启动时间 = max(服务1启动时间, 服务2启动时间)+ 本身启动时间
因此,服务3的启动时间 = max(2, 3) + 4 = 7
进而,服务4的启动时间 = max(2, 3, 7) + 5 = 12
这里提供一个测试用例:
4
2 0 0 1
0 3 0 0
0 1 1 0
0 1 1 1
1
输出应该是7
再提高一个测试用例:
4
5 0 0 0
0 1 0 0
0 1 1 0
1 0 1 3
4
输出应该是8
再补充一个测试用例:
6
6 0 0 0 0 0
1 1 0 0 0 0
0 0 5 1 0 1
0 0 0 2 0 0
0 1 1 0 3 1
0 0 0 0 0 3
5
输出应该是11
图示如下
依赖关系如下:
5 依赖于 2,3服务启动完成;
– 2 依赖于 1 服务启动完成;
– 1 不依赖于其他服务
– 3 依赖于 4,6服务启动完成;
– 4 不依赖于其他服务
– 6 不依赖于其他服务
我们假设当前时刻为0,然后1,4,6同时开始启动
0时刻:1,4,6启动中
1时刻:1,4,6启动中
2时刻:1,6启动中,4启动完成
3时刻:1 启动中,6启动完成,因此该时刻3服务可以启动了
4时刻:1,3启动中
5时刻:1,3启动中
6时刻:3启动中,1启动完成,因此该时刻2服务可以启动了
7时刻:3启动中,2启动完成
8时刻:3启动完成,因此该时刻5服务可以启动了
9时刻:5启动中
10时刻:5启动中
11时刻:5启动完成
JavaScript算法源码
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const lines = [];
let n;
let cache;
rl.on("line", (line) => {
lines.push(line);
if (lines.length === 1) {
n = lines[0] - 0;
}
if (n && lines.length === n + 2) {
lines.shift();
const k = lines.pop();
const matrix = lines.map((line) => line.split(" ").map(Number));
cache = new Array(n);
console.log(getResult(matrix, k));
lines.length = 0;
}
});
function getResult(matrix, k) {
return dfs(k - 1, matrix);
}
function dfs(k, matrix) {
// cache用于记录每个服务所需要时间,避免多个子服务依赖同一个父服务时,对父服务启动时间的重复递归求解
if (cache[k] != undefined) return cache[k];
const preK = matrix[k];
let maxPreTime = 0;
for (let i = 0; i < preK.length; i++) {
if (i != k && preK[i] != 0) {
maxPreTime = Math.max(maxPreTime, dfs(i, matrix));
}
}
cache[k] = matrix[k][k] + maxPreTime;
return cache[k];
}
Java算法源码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int[] cache;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
cache = new int[n];
Arrays.fill(cache, -1);
int[][] matrix = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
matrix[i][j] = sc.nextInt();
}
}
int k = sc.nextInt();
System.out.println(getResult(matrix, n, k));
}
public static int getResult(int[][] matrix, int n, int k) {
return dfs(k - 1, matrix);
}
public static int dfs(int k, int[][] matrix) {
// cache用于记录每个服务所需要时间,避免多个子服务依赖同一个父服务时,对父服务启动时间的重复递归求解
if (cache[k] != -1) return cache[k];
int[] preK = matrix[k];
int maxPreTime = 0;
for (int i = 0; i < preK.length; i++) {
if (i != k && preK[i] != 0) {
maxPreTime = Math.max(maxPreTime, dfs(i, matrix));
}
}
cache[k] = matrix[k][k] + maxPreTime;
return cache[k];
}
}
Python算法源码
# 输入获取
n = int(input())
matrix = [list(map(int, input().split())) for i in range(n)]
k = int(input())
cache = [-1]*n
def dfs(k, matrix):
# cache用于记录每个服务所需要时间,避免多个子服务依赖同一个父服务时,对父服务启动时间的重复递归求解
if cache[k] != -1:
return cache[k]
preK = matrix[k]
maxPreTime = 0
for i in range(len(preK)):
if i != k and preK[i] != 0:
maxPreTime = max(maxPreTime, dfs(i, matrix))
cache[k] = matrix[k][k] + maxPreTime
return cache[k]
# 算法入口
def getResult(matrix, k):
return dfs(k - 1, matrix)
# 算法调用
print(getResult(matrix, k))
免责声明:
评论0