区间不相交问题:
给出N个开区间(x, y),从中选择尽可能多的开区间,使得这些开区间两两没有交集。
先对左端点 从大到小 排序,如果左端点相同就对右端点从小到大排序。
// 区间不相交问题
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 110;
// 区间结构体
struct Inteval{
int x, y; // 开区间 左右端点
}I[maxn];
/*区间排序函数:
先对左端点 从大到小 排序
左端点相同的 从小到大 排序*/
bool cmp(Inteval a, Inteval b){
if(a.x != b.x)
return a.x > b.x;
else
return a.y < b.y;
}
int main(){
int n; // 区间个数
scanf("%d", &n);
while(n != 0){
// 依次录入每个区间的左右端点
for(int i = 0; i < n; i++){
scanf("%d%d", &I[i].x, &I[i].y);
}
}
// 对所有区间进行排序(先按 左端点 从大到小排序,再按 右端点 从小到大排序)
sort(I, I+n, cmp);
// ans 记录不相交区间个数,lastX记录上一个被选中区间的 左端点
int ans = 1, lastX = I[0].x; // 默认第一个区间被选中
for(int i = 1; i < n; i++){
if(I[i].y <= lastX){
lastX = I[i].x;
ans++;
}
}
printf("%d\n", ans);
return 0;
}
区间选点问题
给出 N 个闭区间 [x, y],求最少需要确定多少个点,才能使每个闭区间中都存在一个点。
如果闭区间 I1被 I2 包含,那么在 I1 中取点可以保证这个点一定在 I2内。把所有区间按左端点从大到小排序,只要取左端点,这样这个点就能覆盖到尽可能多的的区间。