题目描述
给出n个区间的起点和终点,求最少使用其中多少个区间可以将所有区间所在的区域完全覆盖。(测试的数据确保这1点)。
输入要求
第1行一个整数n,表示n个区间;
第2行开始n行,每行2个整数,表示一个区间范围。
类似[1,4][5,6]被认为是覆盖了[1,6]。
输出要求
从起点开始,按区间先后顺序,输出选中的区间。所选的区间应尽可能向终点扩展。
输入样例
7
1 5
1 6
3 6
1 7
6 9
9 10
7 9
输出样例
1 7
6 9
9 10
INPUT
7 2 6 1 4 3 6 3 7 6 8 2 4 3 5
Expect
1 4 3 7 6 8
#include<iostream>
#include<algorithm>
using namespace std;
class Section{
public:
int num1;
int num2;
};
// 根据区间的左端点进行升序排序
// 左端点一致的根据右端点升序排序
//sort 中的规则
bool cmp(Section s1, Section s2){
if(s1.num1<s2.num1)
return true;
else if(s1.num1==s2.num1 && s1.num2<s2.num2)
return true;
else
return false;
}
int main()
{
Section a[100];
Section r[100];//将在a中选好的数放到r中
int n, cnt = 0,i; // 区间的个数 覆盖所需区间的个数
cin >>n;
for( i=0; i<n; i++){
cin >> a[i].num1 >> a[i].num2;
}
sort(a, a+n, cmp);
int right = a[0].num1-1;// 标记前一位的num2的最大值,由于是第一位就num1-1
int end = a[n-1].num2; // 区域右端点
// 找到一个区间左端点在已覆盖区域内,右端点尽可能长
for( i=0; i<n-1; )
{
int max_right = a[i].num2, max_index = i;
//如果第一位数都在原先范围内,将比较第二位谁最大
//right+1防止 1 3,4 5 的发生
while(a[i].num1<=right+1 && i<n){
if(a[i].num2>max_right){
max_right = a[i].num2;
max_index = i;
}
i++; //比较完数组往后移
} // 循环完能确定num1相同下选取的num2数,num2存在max_right中
right = max_right;//运行到这里已经排除了是否num1在num2内或边上
r[cnt++] = a[max_index];
i = max_index;
if(right == end)
break;
}
for( i=0; i<cnt; i++){
cout << r[i].num1 << " " << r[i].num2 << endl;
}
return 0;
}