题目
给定N个闭区间[ai,bi],请你将这些区间分成若千组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。
输出最小组数。
输入格式
第一行包含整数N,表示区间数。
接下来N行,每行包含两个整数ai , bi,表示一个区间的两个端点。
输出格式
输出一个整数,表示最小组数。
数据范围
1 ≤N≤105,
—109≤ ai≤bi≤109
- 输入样例:
3
-1 1
2 4
3 5
- 输出样例
2
代码
import javafx.util.Pair;import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;/*** @author akuya* @create 2023-07-18-18:44*/
public class sectionGroping {static int N=10010;static int n;public static void main(String[] args) {Scanner scanner=new Scanner(System.in);n=scanner.nextInt();Pair<Integer,Integer> p[]=new Pair[N];for(int i=0;i<n;i++){int a=scanner.nextInt();int b=scanner.nextInt();p[i]=new Pair<>(a,b);}Arrays.sort(p,0,n, new Comparator<Pair<Integer, Integer>>() {@Overridepublic int compare(Pair<Integer, Integer> o1, Pair<Integer, Integer> o2) {return o1.getKey()-o2.getKey();}});PriorityQueue<Pair<Integer,Integer>> queue=new PriorityQueue<Pair<Integer,Integer>>(new Comparator<Pair<Integer, Integer>>() {@Overridepublic int compare(Pair<Integer, Integer> o1, Pair<Integer, Integer> o2) {return o1.getValue()-o2.getValue();}});for(int i=0;i<n;i++){int l=p[i].getKey();if(queue.isEmpty()||queue.peek().getValue()>l){queue.add(new Pair(p[i].getKey(),p[i].getValue()));}else{Pair<Integer, Integer> p2=queue.poll();queue.add(new Pair(p2.getKey(),p[i].getValue()));}}System.out.println(queue.size());}
}
思路
本题贪心思路如下图
如何实现贪心思路又是另一个难点,当然,你已经熟练掌握了优先队列的使用话,问题就迎难而解了。