前言:
拼多多的笔试题对我来讲比较难,参考牛客大佬的题解,自己开始预习题目中涉及的知识点吧
作者:Sss201903111816437
链接:https://www.nowcoder.com/discuss/212692
来源:牛客网
One:几乎严格升序
2.回溯
Two:首尾相连的一组字符串(回溯)
Three: 多任务的执行顺序(贪心+拓扑)
题目:现在一共有N个待执行的任务,每个任务需要Pi的时间完成执行。同时任务之间可能会有一些依赖关系,比如任务1可能依赖任务2和任务3,那么任务1必须等任务2和任务3执行完成后才能开始执行。为了最小化任务的平均返回时长,请安排所有任务的执行顺序。假设在零时刻,所有N个任务已到达系统。
思路:贪心(每次先将不依赖其他任务的任务按从小到大的顺序执行) 借助优先队列(堆)BFS
-
构建图 map<顶点,依赖的顶点>,同时更新每个顶点的入度(该顶点依赖其他的顶点的个数,比如执行任务5,需要先执行任务1,2,3,则任务5的入度为3),不依赖其他顶点的顶点的度为0
-
BFS,入度为0的顶点先进堆,依次弹出的同时,更新依赖该顶点的所有顶点的入度(该顶点不在图中了,被依赖的顶点的度-1),更新后符合入度=0的顶点入堆
public class Main3 {
/**
* 题目:一共有N个待执行的任务,每个任务需要Pi时间,任务之间有依赖,求完成任务的平均时间最短 思路:拓扑排序 +
* 贪心(每次先将不依赖其他任务的任务按从小到大的顺序执行) 借助优先队列(堆)BFS 1.构建图 map<顶点,依赖的顶点>
* 同时更新每个顶点的入度(该顶点依赖其他的顶点的个数,比如执行任务5,需要先执行任务1,2,3,则任务5的入度为3),不依赖其他顶点的顶点的度为0
* 2.BFS,入度为0的顶点先进堆,依次弹出的同时,更新依赖该顶点的所有顶点的入度(该顶点不在图中了,被依赖的顶点的度-1),更新后符合入度=0的顶点入堆
*/
static class Task {
int seq;
int time;
public Task(int seq, int time) {
this.seq = seq;
this.time = time;
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
Task[] tasks = new Task[n + 1];
for (int i = 1; i <= n; i++) {
tasks[i] = new Task(i, in.nextInt());
}
// 1.构建图
HashMap<Integer, List<Integer>> graph = new HashMap<>();
int[] degree = new int[n + 1];
for (int i = 1