题目描述
给定n个开区间,问最多能选出多少个不相交的区间(贪心母题)
样例
输入
12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
0
输出
5
思路:典型的贪心问题。构造一个point类型的数组装n个区间。既然要选择最多个数目,不妨对区间的右端点排序。那么我们不难想出,右端点最小的区间是一定要选的,因为选它最实惠。假如它没有另外相交的区间,肯定要选它没问题。假如有另外相交的区间,那么与它相交区间的右端点肯定都不比它小,如果不选它而选别的,显而易见不如选它实惠,因为它可以为后面的选择留出更多的空间。另外需要学习的是,对结构体的sort函数,需要一个定义<的函数cmp。 细节参见代码。
//最多不相交区间问题
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 110;
struct qujian{//定义结构体区间,包括左端点,右端点
int x,y;
};
qujian s[maxn];//定义区间数组
bool cmp(qujian a,qujian b)//定义对区间的sort中的<函数
{
return a.y < b.y;
}
int main()
{
int n;
while(scanf("%d",&n) && n){//n个区间
int cnt = 0;
for(int i = 0 ; i < n ; i ++) scanf("%d%d",&s[i].x,&s[i].y);
sort(s,s+n,cmp);//对数组按右区间大小排序
for(int i = 0; i < n; i ++){
if(s[i].x == -1) continue;//因为正常的区间都是非负整数,所以把x置为-1的区间视为抛弃区间
cnt ++;//此时选出最前面的区间
for(int j = 0; j < n; j ++)
if(s[j].x < s[i].y) s[j].x = -1; //所有和该区间有交点的区间全部抛弃
}
printf("%d\n",cnt);
}
return 0;
}
探讨了如何通过贪心算法解决给定多个开区间情况下选取最多不相交区间的问题,给出了具体的实现代码。
445

被折叠的 条评论
为什么被折叠?



