牛客网真题-70-任务调度

任务调度

http://www.nowcoder.com/questionTerminal/f7efb182b285403a84c10ee4e6f6075a

生产者-消费者问题:PM生产Idea,程序员消费idea
按时间状态模拟,一个生产Queue,一个待消费Queue,到了时间,把生产Queue中的idea放入待消费Queue中,如果有空闲的程序员,程序员就去取一个idea来使用,此时程序员身上带了一个倒计时的定时器。定时器归0则任务完成。
这两个Queue使用优先级队列来定义,按照题目要求定义:
生产Queue以创建时间作为比较器,任务Queue通过三条规则定义一个字典序。
为了保证输出的有序:还需要建议输入id与Idea的映射关系(HashMap)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    static class Idea {
        int id;  //不是pm的编号
        int create;//产生时间;
        int power; //优先级
        int need; //需要时间
        int finish;

        public Idea(int id, int create, int power, int need){
            this.id = id;
            this.create = create;
            this.power = power;
            this.need = need;
            this.finish = -1;
        }
    }


    public static void main(String[] args) throws IOException{
        BufferedReader buff = new BufferedReader(new InputStreamReader(System.in));
        String[] s0 = buff.readLine().split(" ");
        int n = Integer.parseInt(s0[0]); //pm,没用上此变量
        int m = Integer.parseInt(s0[1]); //程序员
        int p = Integer.parseInt(s0[2]);
        int[] programer = new int[m];//标记程序员还有多少时间干完活
        HashMap<Integer, Idea> map = new HashMap<>();
        //生产线 //
        PriorityQueue<Idea> createQ = new PriorityQueue<>(Comparator.comparingInt(o -> o.create));
        //待完成任务 //
        PriorityQueue<Idea> taskQ = new PriorityQueue<>(new Comparator<Idea>() {
            @Override public int compare(Idea o1, Idea o2){
                if(o1.power > o2.power){
                    return 1;
                }else if(o1.power < o2.power){
                    return -1;
                }else{
                    if(o1.need > o2.need){
                        return 1;
                    }else if(o1.need < o2.need){
                        return -1;
                    }else{
                        if(o1.create > o2.create){
                            return 1;
                        }else if(o1.create < o2.create){
                            return -1;
                        }else{
                            return 0;
                        }
                    }
                }
            }
        });
        //生产计划********************//
        for(int i = 0; i < p; i++){
            int[] temp = Arrays.stream(buff.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
            Idea idea = new Idea(i, temp[1], temp[2], temp[3]);
            map.put(i, idea);
            createQ.add(idea);
        }

        //两个Queue都是空时,停止
        int k = 0;
        while ((!taskQ.isEmpty()) || (!createQ.isEmpty())) {
            while ((!createQ.isEmpty()) && createQ.peek().create == k) {
                taskQ.offer(createQ.poll());
            }
            int indexProgramer = 0;//遍历每一个程序员
            while (indexProgramer < programer.length) {
                if(programer[indexProgramer] > 0){
                    programer[indexProgramer]--; //程序员干活啦
                    indexProgramer++;
                }else{//这个程序员空闲
                    if(taskQ.isEmpty()){
                        indexProgramer++;
                    }else{//有任务做了
                        Idea idea = taskQ.poll();
                        idea.finish = k + idea.need;//计算完成时间
                        programer[indexProgramer] = idea.need;//程序员需要消耗的时间
                    }
                }
            }
            k++;//时间增加
        }
        for(int i = 0; i < p; i++){
            System.out.println(map.get(i).finish);
        }
    }
}
全部评论

相关推荐

头像
10-13 18:10
已编辑
东南大学 C++
。收拾收拾心情下一家吧————————————————10.12更新上面不知道怎么的,每次在手机上编辑都会只有最后一行才会显示。原本不想写凉经的,太伤感情了,但过了一天想了想,凉经的拿起来好好整理,就像象棋一样,你进步最快的时候不是你赢棋的时候,而是在输棋的时候。那废话不多说,就做个复盘吧。一面:1,经典自我介绍2,项目盘问,没啥好说的,感觉问的不是很多3,八股问的比较奇怪,他会深挖性地问一些,比如,我知道MMU,那你知不知道QMMU(记得是这个,总之就是MMU前面加一个字母)4,知不知道slab内存分配器-&gt;这个我清楚5,知不知道排序算法,排序算法一般怎么用6,写一道力扣的,最长回文子串反问:1,工作内容2,工作强度3,关于友商的问题-&gt;后面这个问题问HR去了,和中兴有关,数通这个行业和友商相关的不要提,这个行业和别的行业不同,别的行业干同一行的都是竞争关系,数通这个行业的不同企业的关系比较微妙。特别细节的问题我确实不知道,但一面没挂我。接下来是我被挂的二面,先说说我挂在哪里,技术性问题我应该没啥问题,主要是一些解决问题思路上的回答,一方面是这方面我准备的不多,另一方面是这个面试写的是“专业面试二面”,但是感觉问的问题都是一些主管面/综合面才会问的问题,就是不问技术问方法论。我以前形成的思维定式就是专业面会就是会,不会就直说不会,但事实上如果问到方法论性质的问题的话得扯一下皮,不能按照上面这个模式。刚到位置上就看到面试官叹了一口气,有一些不详的预感。我是下午1点45左右面的。1,经典自我介绍2,你是怎么完成这个项目的,分成几个步骤。我大致说了一下。你有没有觉得你的步骤里面缺了一些什么,(这里已经在引导我往他想的那个方向走了),比如你一个人的能力永远是不够的,,,我们平时会有一些组内的会议来沟通我们的所思所想。。。。3,你在项目中遇到的最困难的地方在什么方面4,说一下你知道的TCP/IP协议网络模型中的网络层有关的协议......5,接着4问,你觉得现在的socket有什么样的缺点,有什么样的优化方向?6,中间手撕了一道很简单的快慢指针的问题。大概是在链表的倒数第N个位置插入一个节点。————————————————————————————————————10.13晚更新补充一下一面说的一些奇怪的概念:1,提到了RPC2,提到了fu(第四声)拷贝,我当时说我只知道零拷贝,知道mmap,然后他说mmap是其中的一种方式,然后他问我知不知道DPDK,我说不知道,他说这个是一个高性能的拷贝方式3,MMU这个前面加了一个什么字母我这里没记,别问我了4,后面还提到了LTU,VFIO,孩子真的不会。
走呀走:华子二面可能会有场景题的,是有些开放性的问题了
点赞 评论 收藏
分享
评论
11
收藏
分享

创作者周榜

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