贪心 -- 畜栏预定

 

 

 

 

本题是一个贪心的简单题,思路简单,但是代码对于我来说比较男写,借鉴学好Java就改名的代码。

思路,按照每个牛的开始时间进行排序,将结束时间放入一个优先队列中,若下一头牛的开始时间小于优先队列中的结束时间,直接让这头牛和队列中的牛公用一个畜栏。不然加一个畜栏。


import java.util.*;
public class Main {
    public static void main(String[] args) {
        PriorityQueue<Cowl> pq = new PriorityQueue<Cowl>(cc);
        // 结束时间排序,
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Cow1[] c1 = new Cow1[n];
        
        for (int i = 0; i < c1.length; i++) {
            c1[i]=new Cow1();
            c1[i].starttime = sc.nextInt();
            c1[i].endtime = sc.nextInt();
            c1[i].number = i+1;
        }
        sc.close();
    
        Arrays.sort(c1, new Cow1());
        // 按开始时间排序,牛。
        int index=1;
        c1[0].x = 1;
        pq.add(c1[0]);

        for (int i = 1; i < c1.length; i++) {
            if(c1[i].starttime > pq.peek().endtime){
                // 开始时间小于,最小的结束时间。
                // 不用新的栏子。
                c1[i].x=pq.peek().x;
                // 用的栏子 和最小的牛一样 。
                pq.remove();
                pq.add(c1[i]);
                // 完成pq的更新。
            }else{
                // 加一个栏子 并入队。
                index++;
                c1[i].x=index;
                pq.add(c1[i]);
            }
        }

        Arrays.sort(c1, ccs);
        // 按照标号进行排序,确保输出的顺序。
        System.out.println(index);
        // 输出需要多少栏子
        for (int i = 0; i < c1.length; i++) {
            System.out.println(c1[i].x);
        // 每个牛的栏子号。
        }

    }

    static Comparator<Cow1> ccs = new Comparator<Cow1>() {
        public int compare(Cow1 c1 , Cow1 c2){
            if(c1.number > c2.number)return 1;
            return -1;    
        }
    };


    static Comparator<Cow1> cc = new Comparator<Cow1>() {
        @Override
        public int compare(Cow1 c1,Cow1 c2){
            if(c1.endtime > c2.endtime)
                return 1;
            return -1;
        }
    };
}

class Cow1 implements Comparator<Cow1> {
    int starttime;
    int endtime;
    int number;
    int x;
    
    public int compare(Cow1 c1, Cow1 c2){
        if(c1.starttime>c2.starttime)
            return 1;
        return -1;
    }
}

 

 
posted @ 2022-01-15 16:02  No2ya  阅读(33)  评论(0)    收藏  举报