http://www.51nod.com/tutorial/course.html#!courseId=14
输入
第1行:1个数N,线段的数量(2 <= N <= 10000)
第2 - N + 1行:每行2个数,线段的起点和终点(-10^9 <= S,E <= 10^9)
输出
输出最多可以选择的线段数量。
输入示例
3
1 5
2 3
3 6
输出示例
2
即把每一个活动的开始和结束时间看作是线段的左右两段,然后计算不重叠的线段的最多的条数。。
另外开始与结束在同一点不算重叠。。。!!
附上代码:
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
const int maxn=10005;
using namespace std;
struct Node
{
int l,r;
};
Node a[maxn];
int cmp(Node x,Node y)//对左边进行升序排序。。
{
if(x.l<y.l) return 1;
else if(x.l==y.l&&x.r<y.r) return 1;
return 0;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&a[i].l,&a[i].r);
}
sort(a,a+n,cmp);
int mark=1;
Node s=a[0];
for(int i=1;i<n;i++)
{
if(a[i].r<=s.r)//线段i在线段i-1内.。
s=a[i];
else if(a[i].l>=s.r)
{
mark++;
s=a[i];
}//这里居然忘记打花括号。。。。
}
printf("%d\n",mark);
return 0;
}