zoukankan      html  css  js  c++  java
  • 贪心算法--堆--安排会议室

    一些项目要占用一个会议室宣讲, 会议室不能同时容纳两个项目的宣讲。

    给你每一个项目开始的时间和结束的时间(给你一个数组, 里面是一个个具体的项目),

    你来安排宣讲的日程, 要求会议室进行 的宣讲的场次最多。

    返回这个最多的宣讲场次。

    贪心:按照结束时间最早排序

    public class BestArrange {
        //将会议的开始时间和结束时间
        public static class Meeting{
            private int startTime;
            private int endTime;
    
            public Meeting(int startTime, int endTime){
                this.startTime = startTime;
                this.endTime = endTime;
            }
        }
    
        //小根堆的比较器
        public static class MinheapComparator implements Comparator<Meeting>{
            @Override
            public int compare(Meeting o1, Meeting o2) {
                return o1.endTime - o2.endTime;
            }
        }
    
        /**
         * 可以利用按照结束时间排序的小根堆来完成,会议开始时间小于当前会议结束时间的都要忽略掉
         * @param start
         * @param end
         * @param initStart
         * @return
         */
        public static int bestArrangeByHeap(int[] start, int[] end, int initStart){
            if(start.length == 0 || end.length == 0 || (start.length != end.length)) return 0;
            int res = 0;
            //利用优先队列和小根堆比较器构建小根堆
            //按照结束时间进行排序
            PriorityQueue<Meeting> meetings = new PriorityQueue<>(new MinheapComparator());
    
            for(int i = 0; i < start.length; i++){
                meetings.add(new Meeting(start[i], end[i]));
            }
    
            while(meetings.size() > 0){
                Meeting meeting = meetings.poll();
                //如果小根堆中会议的开始时间大于当前会议的开始时间,
                // 那么这些会议可以选入
                //同时当前时间修改为选入会议的结束时间
                if(meeting.startTime >= initStart){
                    res++;
                    initStart = meeting.endTime;
                }
            }
            return res;
        }
    
        /**
         * 还可以利用按照结束时间排序的数组来完成,
         * 利用Arrays工具类的sort,其中传入比较器即可
         * 会议开始时间小于当前会议结束时间的都要忽略掉
         * @param start
         * @param end
         * @param initStart
         * @return
         */
        public static int bestArrangeByArray(int[] start, int[] end, int initStart){
            if(start.length == 0 || end.length == 0 || (start.length != end.length)) return 0;
            int res = 0;
    
            Meeting[] meetings = new Meeting[start.length];
    
            for(int i = 0; i < start.length; i++){
                meetings[i] = new Meeting(start[i], end[i]);
            }
    
            //利用结束时间从小到大排序
            Arrays.sort(meetings, new MinheapComparator());
    
            for(int i = 0; i < meetings.length; i++){
                if(meetings[i].startTime >= initStart){
                    res++;
                    initStart = meetings[i].endTime;
                }
            }
            return res;
        }
    }
    

      

  • 相关阅读:
    中国剩余定理(SCAUOJ 1077)
    uva 11426 GCD
    LA 4119 Always an integer (数论+模拟)
    uva 12003 Array Transformer (线段树套平衡树)
    uva 10253 Series-Parallel Networks (整数划分+多重集)
    LA 4123 Glenbow Museum
    uva 11361 Investigating Div-Sum Property
    2013多校训练赛第二场 总结
    uva 11174 Stand in a Line (排列组合)
    canvas 画椭圆
  • 原文地址:https://www.cnblogs.com/SkyeAngel/p/8964036.html
Copyright © 2011-2022 走看看