首页 > 试题广场 >

编程题3

[编程题]编程题3
  • 热度指数:2698 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 80M,其他语言160M
  • 算法知识视频讲解

产品经理(PM)有很多好的idea,而这些idea需要程序员实现。现在有N个PM,在某个时间会想出一个 idea,每个 idea 有提出时间、所需时间和优先等级。对于一个PM来说,最想实现的idea首先考虑优先等级高的,相同的情况下优先所需时间最小的,还相同的情况下选择最早想出的,没有 PM 会在同一时刻提出两个 idea。

同时有M个程序员,每个程序员空闲的时候就会查看每个PM尚未执行并且最想完成的一个idea,然后从中挑选出所需时间最小的一个idea独立实现,如果所需时间相同则选择PM序号最小的。直到完成了idea才会重复上述操作。如果有多个同时处于空闲状态的程序员,那么他们会依次进行查看idea的操作。

求每个idea实现的时间。

输入第一行三个数N、M、P,分别表示有N个PM,M个程序员,P个idea。随后有P行,每行有4个数字,分别是PM序号、提出时间、优先等级和所需时间。输出P行,分别表示每个idea实现的时间点。


输入描述:
输入第一行三个数N、M、P,分别表示有N个PM,M个程序员,P个idea。随后有P行,每行有4个数字,分别是PM序号、提出时间、优先等级和所需时间。全部数据范围 [1, 3000]。


输出描述:
输出P行,分别表示每个idea实现的时间点。
示例1

输入

2 2 5
1 1 1 2
1 2 1 1
1 3 2 2
2 1 1 2
2 3 5 5

输出

3
4
5
3
9

这个题的描述不是很容易让人看懂,我也是看着执行的预期输出反着推题干所表述的含义,将题目梳理并补充如下

思路

  • 有N个PM项目经理在时间轴上的不同时刻给 M个程序员提idea需求,idea拥有序号、优先级、提出时间、所需时间的属性。PM有多个需求的时候先自己PK,选出认为最优先的丢给程序员去做,在众多PM中,程序员资源优先也只能从所有PM过滤完的需求再次选所需时间最短的来做。
  • 大前提是程序员不知道未来时间的需求,不会做未来的idea需求,也就是只会从当前时刻以前的需求中进行挑选
  • 如果当前时间一个PM已经有多个idea需求提出,那么PM只能选出一个最优先的(题干描述的很隐蔽,这条是关键)
  • 给定的数据中,所有需求按时间顺序排序,每次处理时大于当前时间的过滤掉,小于当前时间的都有可能去处理
  • 过滤掉时间条件后,按照每个PM的各自的需求,各自排序(这道题的核心坑点就在这,读题目容易误解,如果每个PM不将自己的需求排好序选出一个出来,而是将所有的需求都丢给程序员,程序员自身理解的优先级规则,是按照所需时间多少来做的,那么一个PM的两个需求就有可能程序员先做时间少但优先级低的)
  • 所有PM都将自己最优先的需求列出后,程序员再从这个集合中选出要做的,没来得及做的需求会参与到下次比较中,下次比较有可能又被新的需求更高的优先级替代掉。

具体操作

  • 比较器
    • 时间顺序比较器
    • PM理解的优先级比较器
    • Programmer理解的优先级比较器
  • 集合
    1) 所有idea的集合
    2) 通过所有idea的集合过滤出小于当前时间的
    3) 从2中得出的按照PM各自选出最优先的得出新的集合
    4) 空闲的程序员从3中的集合,选出程序员理解的做先做的任务去做,剩余的任务将参与下一次第3步骤的比较
发表于 2022-05-18 17:06:28 回复(0)
改了2天一直不对,原来是犯了个逻辑错误,对于优先级, 数字越低,优先级也越低,  我是按照数字越低,优先级越高搞得,竟然还能过30%..........
import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int pmCount = sc.nextInt();
        int softCount = sc.nextInt();
        int ideaCount = sc.nextInt();
        sc.nextLine();

        List<Idea> ideas = new ArrayList<>();
        for (int i = 1; i <= ideaCount; i++) {
            Idea idea = new Idea();
            idea.id = i;
            idea.pmno = sc.nextInt();
            idea.submitTime = sc.nextInt();
            idea.order = sc.nextInt();
            idea.needTime = sc.nextInt();
            ideas.add(idea);
            sc.nextLine();
        }
        Map<Integer, Idea> completed = new HashMap<>();
        work(ideas, softCount, completed, ideaCount,pmCount);
        for (int i = 1; i <= ideaCount; i++) {
            System.out.println(completed.get(i).endTime);
        }
    }

    public static void sortForPM(List<Idea> ideas) {
        ideas.sort((i1, i2) -> {

            int seq1 = i2.order - i1.order;
            int seq2 = i1.needTime - i2.needTime;
            int seq3 = i1.submitTime - i2.submitTime;
            return seq1 != 0 ? seq1 : (seq2 != 0 ? seq2 : seq3);

        });
    }

    public static void selectBySubmitTime(Map<Integer, List<Idea>> pmIdeaMap, List<Idea> ideaList, int currTime) {

        for (Idea idea : ideaList) {
            if (idea.submitTime == currTime) {
                pmIdeaMap.get(idea.pmno).add(idea);
            }
        }
        for (int i = 1; i <= pmIdeaMap.size(); i++) {
                if (!pmIdeaMap.get(i).isEmpty()) {
                    sortForPM(pmIdeaMap.get(i));
            }
        }
    }

    public static void sortForSoft(List<Idea> ideas) {
        ideas.sort((i1, i2) -> {
            int seq1 = i1.needTime - i2.needTime;
            int seq2 = i1.pmno - i2.pmno;
            return seq1 != 0 ? seq1 : seq2;
        });
    }

    public static void work(List<Idea> ideaList, int softCount, Map<Integer, Idea> completed, int ideaCount,int pmCount) {
        Map<Integer, List<Idea>> pmIdeaMap = new HashMap<>();
        for (int j=1;j<=pmCount;j++){
            pmIdeaMap.putIfAbsent(j,new ArrayList<>());
        }

        int curTime = 0;
        List<Idea> working = new ArrayList<>();
        while (true) {
            if (completed.size() == ideaCount) {
                return;
            }
            curTime++;

            // add for pm
            selectBySubmitTime(pmIdeaMap, ideaList, curTime);
            // add time
            List<Idea> toDelete = new ArrayList<>();
            for (Idea idea : working) {
                if (curTime== idea.endTime) {
                    toDelete.add(idea);
                    completed.put(idea.id, idea);
                    softCount++;
                }
            }
            working.removeAll(toDelete);
            while (softCount > 0) {
                Idea idea=selectForSoft(pmIdeaMap);
                if (idea==null){
                    break;
                }
                idea.endTime = curTime + idea.needTime;
                softCount--;
                working.add(idea);
            }



        }

    }

    public static Idea selectForSoft(Map<Integer, List<Idea>> pmIdeaMap) {
        List<Idea> toWorkSet=new ArrayList<>();
        for (List<Idea> itemList : pmIdeaMap.values()) {
                if (itemList.size() > 0) {
                    toWorkSet.add(itemList.get(0));
                }
            }


        if(!toWorkSet.isEmpty()){
            sortForSoft(toWorkSet);
            Idea idea = toWorkSet.get(0);
            pmIdeaMap.get(idea.pmno).remove(idea);
            return idea;
        }

        return null;
    }

    static class Idea {

        public int id;
        public int pmno;
        public int submitTime;
        public int order;
        public int needTime;
        public int endTime;
    }

}


发表于 2020-08-27 12:41:03 回复(0)