原文链接:click here
贪心算法就可以解决了。去掉尽可能少的区间,使剩下的区间各不相交即可满足题意。将区间末端按从小到大排序,排好后从第一个区间开始向后操作,若后一个区间的始端点大于等于前一个区间的末端点则两区间不相交,计数一次,并标记当前满足条件区间的末端点,下一个区间的起始端再与这个标记的末端点比较,满足则计数,并且更新标记。如此循环,直到比较完数据。
代码如下:
#include<cstdio> #include<algorithm> using namespace std; typedef struct time { int x; int y; }time ; time p[105]; bool a_b(time a, time b) { if(a.y<b.y) return true; else return false; } int main() { int i,l,n; while(scanf("%d",&n)!=EOF&&n!=0) { for(i=0;i<n;i++) { scanf("%d%d",&p[i].x,&p[i].y); } sort(p,p+n,a_b); time k=p[0]; for(l=1,i=0;i<n;i++) { if(p[i].x>=k.y)//后一个区间的前段点不小于前一个区间的后端点,确保其不相交 { l++; k.y=p[i].y; } } printf("%d\n",l); } return 0; }