给定N个开区间(x, y),从中选择尽可能多的开区间,使得这些开区间两两没有交集。
比如(1, 3)、(2, 4)、(3, 5)、(6, 7),可以选择最多三个区间(1, 3)、(3, 5)、(6, 7),它们互相没有交集。
贪心策略:考虑最简单情况,如果开区间I1被开区间I2包含,那么此时最好的选择是I1,因为选更短的就能有更大的空间取容纳其他空间。
I1 x1 ------------- y1
I2 x2 ------------- y2
I3 x3 ------------- y3
I4 x4 ------------- y4
把所有开区间按端点x从大到小排序,如果去除掉区间包含的情况,那么一定有y1 > y2 > … > yn,如图所示I1的右边有一段一定不会和其他区间重叠,如果把它去掉,那么I1的左半边就会被I2包含。这种情况就应该选择I1。换句话说,总应该选择左端点最大的区间。
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 110;
struct Inteval
{
int x, y;
}I[maxn];
bool cmp(Inteval a, Inteval b)
{