找点
时间限制:
2000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
上数学课时,老师给了LYH一些闭区间,让他取尽量少的点,使得每个闭区间内至少有一个点。但是这几天LYH太忙了,你们帮帮他吗?
-
输入
-
多组测试数据。
每组数据先输入一个N,表示有N个闭区间(N≤100)。
接下来N行,每行输入两个数a,b(0≤a≤b≤100),表示区间的两个端点。
输出
- 输出一个整数,表示最少需要找几个点。 样例输入
-
4 1 5 2 4 1 4 2 3 3 1 2 3 4 5 6 1 2 2
样例输出
-
1 3 1
来源
- 原创 上传者
思路:
1、每一组数据创建一个二维数组保存数据。
2、将数组按左端点/右端点排序(升序),我这是按左端点。
3、初始化最小左端点的右端点既right
4、依次判断下一个左端点是否大于right
大于right:说明这个端点是不在以前的区间内。right=该区间的右端点 ++number(区间数)
小于right:说明在一个区间内。需要判断该端点的右端点是否大于以前区间的右端点。right=最小右端点
public class _891_2AC { public static void main(String[] args) { Scanner scan = new Scanner(new BufferedInputStream( System.in)); int number = 1; int testNum; int[][] data; while(scan.hasNext()){ testNum = scan.nextInt(); data = new int[testNum][2]; for(int i = 0; i < testNum; ++i){ data[i][0] = scan.nextInt(); data[i][1] = scan.nextInt(); } int temp; for(int i = 0; i < data.length - 1; ++i){ for(int j = i + 1;j < data.length; ++j){ if(data[j][0] < data[i][0] || (data[j][0] == data[i][0] && data[j][1] < data[i][1])){ temp = data[i][0]; data[i][0] = data[j][0]; data[j][0] = temp; temp = data[i][1]; data[i][1] = data[j][1]; data[j][1] = temp; } } } int right = data[0][1]; for(int i = 1; i < data.length; ++i){ if(data[i][0] > right){ ++number; right = data[i][1]; }else if(data[i][1] < right){ right = data[i][1]; } } System.out.println(number); number = 1; } } }
-
多组测试数据。