Description
给出n个区间的起点和终点,求最少使用其中多少个区间可以将所有区间所在的区域完全覆盖。(测试的数据确保这1点)。
Input
第1行一个整数n,表示n个区间;
第2行开始n行,每行2个整数,表示一个区间范围。
Output
按区间先后顺序,输出选中的区间。
Sample Input
7
1 5
1 6
3 6
1 7
6 9
9 10
7 9
Sample Output
1 7
6 9
9 10
算法思想
- 将区间按照左端点从小到大排序,左端点相同按右端点从小到大排序
- 每次都找到左端点在已覆盖区域内,右端点尽可能长的区间
#include<iostream>
#include<algorithm>
using namespace std;
class Section{
public:
int num1;
int num2;
};
// 根据区间的左端点进行升序排序
// 左端点一致的根据右端点升序排序
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];
int n, cnt = 0; // 区间的个数 覆盖所需区间的个数
cin >>n;
for(int i=0; i<n; i++){
cin >> a[i].num1 >> a[i].num2;
}
sort(a, a+n, cmp);
int right = a[0].num1-1, end = a[n-1].num2; // 覆盖区域的右端点 区域的终点
// 找到一个区间左端点在已覆盖区域内,右端点尽可能长
for(int i=0; i<n-1; ){
int max_right = a[i].num2, max_index = i;
while(a[i].num1<=right+1 && i<n){
if(a[i].num2>max_right){
max_right = a[i].num2;
max_index = i;
}
i++;
}
right = max_right;
r[cnt++] = a[max_index];
i = max_index;
//cout << "i==" << i << endl;
if(right == end)
break;
}
for(int i=0; i<cnt; i++){
cout << r[i].num1 << " " << r[i].num2 << endl;
}
return 0;
}
来源:CSDN
作者:LiuLllDDdd
链接:https://blog.csdn.net/qq_33891314/article/details/103602320