#P1862. 2024.8.1-用友-第三题-项目开发

2024.8.1-用友-第三题-项目开发

小友所在的部门正在进行一系列复杂的开发项目。为了优化开发流程,部门要求工程师在不同的任务之间切换。每个任务有不同的执行时间,有些任务因为各种原因无法进行(标记为-1)。工程师可以在规定的跳跃范围内从一个任务跳到另一个任务,但每次执行任务必须要消耗相应的时间。

你的目标是找到一个从任务列表开头到结束的执行顺序,使得总执行时间最小。如果存在多个总执行时间相同的顺序,返回按索引值更小优先的顺序。如果无法到达最后一个任务,返回一个空数组。

规则

  1. 输入一个整数数组 tasks 表示任务执行时间,长度为n。
  2. 输入一个整数 maxStep 表示单次切换任务的最大切换长度。
  3. 你从任务列表的第一个任务开始 (tasks不是-1)。
  4. 从任务i切换到任务j,消耗的时间为 tasks[j]。
  5. 如果你当前位于任务i,你只能跳到任务 i + k(满足 1 ≤ k ≤ n),其中 k 在范围 [1, maxStep] 内。
  6. 返回一个整数数组,包含你访问的任务索引顺序,使得总执行时间最小。如果多个相同总执行时间的顺序,返回索引值最小的顺序。

排序说明

如果存在多个总执行时间相同的顺序:

  • 假设方案 p1 = [Pa1, Pa2, ..., Pax] 和方案 p2 = [Pb1, Pb2, ..., Pbx]。
  • 如果在两个方案中第一个不同的索引j处,Pa[j] 小于 Pb[j],则选择方案 p1。
  • 如果所有索引都相同,但任务切换次数不同,则选择任务切换次数较少的方案。

提示: 注意排序规则,如1-2-3-4-5和1-4-5 假设两个方案所消耗的时间相同。

输入描述

  • 整数 N,代表任务 tasks 的长度
  • 长度为 N 的数组 tasks 的各个元素
  • 整数 M,代表每次切换任务的最大跳跃长度

输出描述

输出数组,代表总执行时间最短,并且索引值最小的执行方案

补充说明

  • 1 ≤ tasks.length ≤ 1000
  • -1 ≤ tasks[i] ≤ 100
  • tasks ≠ -1
  • 1 ≤ maxStep ≤ 100

示例 1

输入

5
1 2 4 -1 2
2

输出

1 3 5

示例 2

输入

5
1 2 4 -1 2
1

输出

[]

说明

无法到达最后一个任务,输出字符串"[]"