✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)
文章目录
- 1、题目描述
- 2、输入描述
- 3、输出描述
- 4、Java算法源码
- 5. 测试
- 6.解题思路
1、题目描述
现在有n个容器服务,服务的启动可能有一定的依赖性(有些服务启动没有依赖),其次服务自身启动加载会消耗一些时间。
给你一个 nxn 的二维矩阵 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 自身也需要加载),求最少需要等待多长时间。
2、输入描述
第一行输入服务总量n,之后的 n 行表示服务启动的依赖关系以及自身启动加载耗时。
最后一行输入 k 表示计算需要等待多长时间后可以对服务 k 进行集成测试。
其中 1 <= k <= n,1 <= n <= 100。
3、输出描述
最少需要等待多长时间(s)后可以对服务 k 进行集成测试。
4、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] nums = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
nums[i][j] = sc.nextInt();
}
}
int k = sc.nextInt();
//从第K个服务,对应到数组行数就是k-1
int time = needTime(nums, k - 1);
System.out.println(time);
}
//获取当前服务的需要等待的最少时间
public static int needTime(int[][] nums, int k) {
int n = nums[0].length;
int selfTime = nums[k][k];
int dependMaxTime = 0;
for (int i = 0; i < n; i++) {
if (nums[k][i] == 1 && i != k) {
int time = needTime(nums, i);
dependMaxTime = Math.max(dependMaxTime, time);
}
}
return selfTime + dependMaxTime;
}
5. 测试
6.解题思路
- 首先,读取输入的服务总量n和依赖关系以及启动加载时间的二维矩阵useTime。
- 根据输入的服务总量n创建一个nxn的二维数组nums,并将useTime的值赋给nums。
- 读取输入的需要进行集成测试的服务k。
- 调用needTime方法,传入二维数组nums和服务k的索引值(k-1)。needTime方法用于计算当前服务需要等待的最少时间。
- 在needTime方法中,首先获取当前服务自身启动加载时间selfTime,即nums[k][k]。
- 遍历二维数组nums的第k行,如果存在依赖关系(nums[k][i]==1且i!=k),则递归调用needTime方法计算依赖服务i的最少等待时间time,并更新dependMaxTime为依赖服务的最大等待时间。
- 返回selfTime加上dependMaxTime,即为当前服务k进行集成测试所需的最少等待时间。
- 输出最少等待时间。