区间不相交问题:
给出N个开区间(x, y),从中选择尽可能多的开区间,使得这些开区间两两没有交集。例如对开区间(1,3)、(2,4)、(3,5)、(6,7)来说,可以选出最多三个区间(1,3)、(3,5)、(6,7)它们互相没有交集。
首先考虑最简单的情况,如果开区间 I1被开区间 I2包含,如图a,那么显然选择 I1是最好的选择,因为如果选择I1,那么就有更大的空间去容纳其他开区间。
接下来把所有开区间按左端点x从大到小排序,如果去除掉区间包含的情况,那么一定有y1>y2>...>yn成立,如图b。现在考虑应当如何选取区间。通过观察会发现,I1的右边有一段是一定不会和其他区间重叠的,如果把它去掉,那么I1的左边剩余部分就会被I2包含,应当选择I1。因此对这种情况,总是先选择左端点最大的区间。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 110;
struct Inteval{
int x, y;