区间选点
区间选点
油菜花区间选点
题目描述
给定 N 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。
输出选择的点的最小数量。
位于区间端点上的点也算作区间内。
输入格式
第一行包含整数N,表示区间数。
接下来N行,每行包含两个整数 ai,bi表示一个区间的两个端点。
输出格式
输出一个整数,表示所需的点的最小数量。
数据范围
1≤N≤105
−109≤ai≤bi≤109
输入样例
1 | 3 |
输出样例
1 | 2 |
思路
略:
按区域的右端点进行排序
如果区域内没有点,就把区域的右端点作为点
如果有点,那就进行下一个
详:
1.首先,该代码定义了一个结构体 Range,它包含两个成员:l 和 r,分别代表区间的左端点和右端点。这个结构体还定义了一个比较函数,使得我们可以按照右端点对 Range 对象进行排序。
2.在 main 函数中,首先通过 scanf 函数读取一个整数 n,表示区间的数量。
3.然后,程序读入 n 对区间,每对区间通过 scanf 函数读入,并存储到 range 数组中。
4.接着,程序使用 STL 的 sort 函数对 range 数组进行排序。排序的依据是每个区间的右端点。
5.排序后,程序通过一个循环来统计连续区间的数量。变量 res 用来存储这个数量,变量 ed 表示当前已经遍历的区间的右端点。如果遇到一个区间的左端点大于 ed(也就是说,这个区间与之前的区间不连续),那么就将 res 增加 1,并将 ed 更新为当前区间的右端点。
6.最后,程序通过 printf 函数输出 res,即连续区间的数量。
注意事项
在比较函数中,使用了 < 运算符。在 C++ 中,对于自定义的结构体或者类,如果你要定义 < 运算符,那么你需要同时定义 > 运算符。否则,编译器会因为找不到对称的运算符而报错。这里只定义了 < 运算符,但因为结构体 Range 的成员是整型,所以编译器会自动补全 > 运算符。但如果你自定义的结构体包含复杂类型(例如字符串或者自定义类)作为成员,那么你就需要自己定义完整的 < 和 > 运算符了。
代码
1 |
|