还是用递归实现的哦!题目如下图:
Examples
Input
2
1 5
4 6
Output
1
Input
3
1 3
2 5
4 6
Output
2
#include<iostream>
#include<algorithm>
#include<stdio.h>
//贪心算法,找到最多区间相交
// a0 *________*b0
// a1 *_______*b1
// a2 *_____*b2
// 需要保证点在最多的区间,右端点按从小到大排
//若右端点相等,则左端点从大到小排
using namespace std;
struct section{
int left,right;
bool operator<(section &p){//升序比较右端点
return right != p.right ? right<p.right : p.left<left;
}//降序比较左端点
};
int mindot,tag,index;//最小点数
section dot[101];
//int vis[101];
int point(int lop,int n,int tag){//n个区间
if( n<=0 ) {//判断递归终点,所有区间都有点
return mindot;
}
//递归条件
if(dot[tag].right >= dot[lop].left){
point(lop+1,n,tag);
}
else{//在执行到else这一步时,lop其实等于前面已经遍历过的区间数了
//建议debug运行一下就会明白此过程啦
index=lop-tag;
mindot++;
point(lop+1,n-index+1,lop);
}
}
int main(){
int n,result;
while(scanf("%d",&n) != EOF){
mindot=0;tag=0;
for(int i=0;i<n;i++)
cin>>dot[i].left>>dot[i].right;
sort(dot,dot+n);
result=point(0,n,0);
cout<<result<<endl;
}
return 0;
}
这道题我在代码段里的注释已经很齐全了,就不细讲啦,主要是注意两点,找到正确的贪心算法,然后在具体编写代码时,注意递归的结束条件。