生产者-消费者问题: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);
        }
    }
}