贪心 -- 畜栏预定


本题是一个贪心的简单题,思路简单,但是代码对于我来说比较男写,借鉴学好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; } }

浙公网安备 33010602011771号