给定坐标轴上的一组线段,线段的起点和终点均为整数并且长度不小于 ,
请你从中找到最少数量的线段,这些线段可以覆盖住所有线段。
第一行输入为所有线段的数量,不超过 ,
后面每行表示一条线段,格式为 , 和 分别表示起点和终点,取值范围是 。
最少线段数量,为正整数。
3
1,4
2,5
3,6
2
选取2
条线段[1,4]
和[3,6]
即可,这两条线段可以覆盖[2,5]
TreeMap
模拟数轴,key
表示数轴上的整数点,value
表示每个点被覆盖的次数;import java.util.Scanner;
import java.util.TreeMap;
/**
* Created with IntelliJ IDEA.
* <br>Author: Amos
* <br>E-mail: amos@amoscloud.com
* <br>Date: 2023/2/7
* <br>Time: 8:33
* <br>Description:
*/
public class Main0207 {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
int n = Integer.parseInt(scanner.nextLine());
int[][] points = new int[n][2];
for (int i = 0; i < n; i++) {
String[] split = scanner.nextLine().split(",");
points[i] = new int[]{Integer.parseInt(split[0]), Integer.parseInt(split[1])};
}
int res = solution(n, points);
System.out.println(res);
}
}
private static int solution(int n, int[][] points) {
TreeMap<Integer, Integer> line = new TreeMap<>();
for (int i = 0; i < n; i++) {
int[] point = points[i];
for (int j = point[0]; j <= point[1]; j++) {
line.put(j, line.getOrDefault(j, 0) + 1);
}
}
int del = 0;
for (int i = 0; i < n; i++) {
int[] point = points[i];
boolean deletable = true;
for (int j = point[0]; j <= point[1]; j++) {
if (line.get(j) <= 1) {
deletable = false;
break;
}
}
if (deletable) {
for (int j = point[0]; j <= point[1]; j++) {
line.put(j, line.get(j) - 1);
}
del++;
}
}
return n - del;
}
}