大疆笔试 8.14
题目:假设我们有一批任务需要调度执行, 每个任务j(j=0,1...n-1)拥有一个权重wj,我们的目标是调度权重累加和最大
的的任务子集执行。已知任务到达的时刻为sj,终止的时刻为fj (注意,这里fj为任务结束的时刻,而不是执行时长)。
只有当两个任务的执行时间区间没有重叠的情况下, 这两个任务才能被调度先后执行,否则只能选其中之一调度执行。
编写一个函数schedule,输入一个包含n个任务信息的数组 (列表) [wj sj fj], j=0,1...n-1(0,1...n-1为任务
索引),例如,在下面示例中,任务0的信息为[3 0 6], 其中3为该任务的权重,0为任务到达时刻, 6为任务终
止时刻。返回可调度的最优任务子集(即: 该任务子集权重和最大)所对应的任务索引 (输出的任务索引按升序
排列)。为简化输出结果测试,假设最优解只有一组 (测试用例中不会出现多组最优解的情况)。
注:如果任务1为[10 2 5],任务2为[9 5 7], 则任务1和任务2的执行时间区间没有重叠; 如果任务1为[10 2 5],
#大疆笔试##大疆#
的的任务子集执行。已知任务到达的时刻为sj,终止的时刻为fj (注意,这里fj为任务结束的时刻,而不是执行时长)。
只有当两个任务的执行时间区间没有重叠的情况下, 这两个任务才能被调度先后执行,否则只能选其中之一调度执行。
编写一个函数schedule,输入一个包含n个任务信息的数组 (列表) [wj sj fj], j=0,1...n-1(0,1...n-1为任务
索引),例如,在下面示例中,任务0的信息为[3 0 6], 其中3为该任务的权重,0为任务到达时刻, 6为任务终
止时刻。返回可调度的最优任务子集(即: 该任务子集权重和最大)所对应的任务索引 (输出的任务索引按升序
排列)。为简化输出结果测试,假设最优解只有一组 (测试用例中不会出现多组最优解的情况)。
注:如果任务1为[10 2 5],任务2为[9 5 7], 则任务1和任务2的执行时间区间没有重叠; 如果任务1为[10 2 5],
务2为[9 4 7], 则任务1和任务2的执行时间区间有重叠。
思路:时间来不及,就用暴力解了
import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * 输入: * 8个任务,每个任务3个参数 * 然后8行 * 8 3 * 3 0 6 * 1 1 4 * 4 3 5 * 17 3 8 * 9 4 7 * 10 5 9 * 8 6 10 * 1 8 11 * * 输出: * 3 7 */ public class Main { static int maxVal; static List<Integer> ans; public static void dfs(int[][] map, int index, boolean[] visited, int val, List<Integer> path){ if(index == map.length){ if(val>maxVal){ maxVal = val; ans = new ArrayList<>(path); } return; } int v = map[index][0]; boolean flag = true; //先检查时间是否重叠,两端不用检查 for (int i = map[index][1]+1; i < map[index][2]; i++) { if(visited[i]){ flag = false; break; } } if(flag){ //选当前任务 for (int i = map[index][1]; i <= map[index][2]; i++) { visited[i] = true; } path.add(index); dfs(map, index+1, visited, val+v, path); for (int i = map[index][1]; i <= map[index][2]; i++) { visited[i] = false; } path.remove(path.size()-1); } //不选当前任务 dfs(map, index+1, visited, val, path); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); sc.nextLine(); int min = Integer.MAX_VALUE; int max = Integer.MIN_VALUE; int[][] map = new int[n][3]; for (int i = 0; i < n; i++) { int val = sc.nextInt(); int start = sc.nextInt(); int end = sc.nextInt(); map[i][0] = val; map[i][1] = start; map[i][2] = end; min = Math.min(min, start); max = Math.max(max, end); } maxVal = 0; ans = new ArrayList<>(); boolean[] visited = new boolean[max+1]; dfs(map, 0, visited, 0, new ArrayList<>()); for (Integer an : ans) { System.out.print(an + " "); } } }