拼多多7.28Java服务端笔试第三题。(个人考后完成)

当时由于时间原因没写第三题,感觉有点难,第二天自己另外完成一下,由于没有OJ的测试,只是自己测了一下。分享出来欢迎各位老哥提出其中的问题。
题目如下:
0时刻,某人收到了N个工作,完成每个工作所需的时间为cost[i],
工作的完成存在先后的依赖关系(即某些工作必须在其它工作之前完成)。
一个人顺序完成N个工作,问如何安排完成工作的顺序,使得完成工作的平均响应时间最短,
输出这样的顺序,在满足平均响应时间最短的情况下,要求字典序最小?(响应时间:从接收到工作到工作完成的时间)

输入第一行 n, m。n为任务个数,m为任务依赖个数。
输入第二行 Pi,各任务耗时。
输入 3 - 3 + m 行,各任务依赖。
1 3 表示第一个任务依赖于第三个任务

package bishiti.PDD_20190728;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;

/**
 *
 * 0时刻,某人收到了N个工作,完成每个工作所需的时间为cost[i],
 * 工作的完成存在先后的依赖关系(即某些工作必须在其它工作之前完成)。
 * 一个人顺序完成N个工作,问如何安排完成工作的顺序,使得完成工作的平均响应时间最短,
 * 输出这样的顺序,在满足平均响应时间最短的情况下,要求字典序最小?(响应时间:从接收到工作到工作完成的时间)
 *
 * 输入第一行 n, m。n为任务个数,m为任务依赖个数。
 * 输入第二行 Pi,各任务耗时。
 * 输入 3 - 3 + m 行,各任务依赖。
 * 1 3 表示第一个任务依赖于第三个任务
 */
public class P3 {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String n_m = sc.nextLine();
        // 接收输入的m和n
        int n = Integer.valueOf(n_m.split(" ")[0]);
        int m = Integer.valueOf(n_m.split(" ")[1]);
        String P = sc.nextLine();
        ArrayList<Task> tasks = new ArrayList<>();
        String[] timesString = P.split(" ");
        // 接收输入的时间数组,并根据输入建立task的数组
        for (int i = 0;i<n;i++){
            tasks.add( new Task(Integer.valueOf(timesString[i]),i));
        }
        // 接收输入的依赖关系,然后完善各个任务的pre和behand的依赖
        for(int i = 0;i<m;i++){
            String depend = sc.nextLine();
            int taskId = Integer.valueOf(depend.split(" ")[0]);
            int dependId = Integer.valueOf(depend.split(" ")[1]);
            tasks.get(taskId).pre.add(tasks.get(dependId));
            tasks.get(dependId).behand.add(tasks.get(taskId));
        }
        // 将没有依赖的任务放入优先级队列
        PriorityQueue<Task> taskPriorityQueue = new PriorityQueue<>(new TaskComparator());
        for (int i=0;i<tasks.size();i++){
            Task t = tasks.get(i);
            if (t.pre.size()==0){
                taskPriorityQueue.offer(t);
                tasks.remove(t);
                i--;
            }
        }
        StringBuilder result = new StringBuilder();
        while (taskPriorityQueue.size()!=0){
            // 从优先级队列中取出任务,然后执行该任务,再把依赖这个任务的所有任务的pre中去除该任务,
            Task task = taskPriorityQueue.poll();
            result.append(task.number).append(" ");
            for(Task b :task.behand){
                b.pre.remove(task);
                // 如果b任务去除了task的前置之后,他没有前置了,
                // 就把他放到优先级队列中,同时在剩余任务tasks中删除该任务
                if(b.pre.size()==0){
                    taskPriorityQueue.offer(b);
                    tasks.remove(b);
                }
            }
        }
        // 最终按各个任务执行的顺序输出各个任务的编号
        System.out.println(result.toString());
    }
}

/**
 * 任务类,其中value是这个任务需要的时间
 * number是这个任务的编号
 * pre是这个任务所依靠的任务的数组
 * behand是依靠这个任务的任务的数组
 */
class Task{
    int value;
    int number;
    ArrayList<Task> pre;
    ArrayList<Task> behand;

    public Task(int v,int n) {
        this.number = n;
        this.value = v;
        this.pre = new ArrayList<>();
        this.behand = new ArrayList<>();
//        this.isFinish = false;
    }
}

/**
 * 用于优先级队列的比较器
 */
class TaskComparator  implements Comparator<Task>{

    @Override
    public int compare(Task t1, Task t2) {
        return t1.value-t2.value;
    }
}
#拼多多##笔试题目#
全部评论

相关推荐

只有一个苍穹外卖外加正在看黑马点评,可以找小厂实习吗,还有我的简历有什么大问题吗
Java抽象小篮子:感觉有点熟悉,问题1是学历,2是没实习经历,3是专业技能写得太少太少了(怎么写可以看我置顶帖),4是仅这一个项目找实习不够看。拷打完毕,简历怎么写可以看我置顶帖子
点赞 评论 收藏
分享
牛客583549203号:腾讯还好,况且实习而已,实习生流动性很大,属于正常现象,记得和HR委婉解释
点赞 评论 收藏
分享
能干的三文鱼刷了100道题:公司可能有弄嵌入式需要会画pcb的需求,而且pcb能快速直观看出一个人某方面的实力。看看是否有面试资格。问你问题也能ai出来,pcb这东西能作假概率不高
点赞 评论 收藏
分享
评论
5
20
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务