大厂笔试题
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
2.5 KiB

  1. #
  2. # wukun 华为云笔试
  3. # 软件安装工具
  4. # 有一个比较复杂的软件系统需要部署到客户提供的服务器上。该软件系统的安装过程非常繁琐,为了降低操作成本,需要开发一个工具实现自动化部署。软件的安装过程可以分成若干个小步骤,某些步骤间存在依赖关系,被依赖的步骤必须先执行完,才能执行后续的安装步骤。满足依赖条件的多个步骤可以并行执行。请你开发一个调度程序,以最短的时间完成软件的部署。
  5. # 输入:
  6. # 第一行:总步骤数 N(0<N<=10000)
  7. # 第二行:N个以空格分隔的整数,代表每个步骤所需的时间。该行所有整数之和不大于int32
  8. # 第三行开始的N行:表示每个步骤所依赖的其它步骤的编号(编号从1开始,行号减2表示步骤的编号),如果依赖多个步骤,用空格分隔。-1表示无依赖测试用例确保各个安装步骤不会出现循环依赖。
  9. # 输出:
  10. # 1个数字,代表最短执行时间。
  11. # 样例1
  12. # 输入:4
  13. # 6 2 1 2
  14. # -1
  15. # 1
  16. # 3
  17. # 输出:9
  18. # 样例2:
  19. # 输入:4
  20. # 1 2 3 4
  21. # 2 3
  22. # 3
  23. # -1
  24. # 1
  25. # 输出:10
  26. from collections import defaultdict, deque
  27. def func(N, step_times, dependencies):
  28. # 构建图和入度计数
  29. graph = defaultdict(list)
  30. in_degree = [0] * N
  31. time_to_complete = [0] * N
  32. # 填充依赖关系
  33. for i in range(N):
  34. for dep in dependencies[i]:
  35. if dep != -1:
  36. graph[dep - 1].append(i)
  37. in_degree[i] += 1
  38. # 使用队列处理入度为0的步骤
  39. queue = deque()
  40. for i in range(N):
  41. if in_degree[i] == 0:
  42. queue.append(i)
  43. time_to_complete[i] = step_times[i]
  44. # 进行拓扑排序
  45. while queue:
  46. current = queue.popleft()
  47. current_completion_time = time_to_complete[current]
  48. for neighbor in graph[current]:
  49. in_degree[neighbor] -= 1
  50. time_to_complete[neighbor] = max(time_to_complete[neighbor], current_completion_time + step_times[neighbor])
  51. if in_degree[neighbor] == 0:
  52. queue.append(neighbor)
  53. return max(time_to_complete)
  54. if __name__ == "__main__":
  55. # 输入示例
  56. N = int(input())
  57. step_times = list(map(int, input().split()))
  58. print(step_times)
  59. dependencies = []
  60. for _ in range(N):
  61. deps = list(map(int, input().split()))
  62. dependencies.append(deps)
  63. # 输出最短执行时间
  64. print(func(N, step_times, dependencies))