题目描述:
现在各大oj上有n个比赛,每个比赛的开始、结束的时间点是知道的。
yyy认为,参加越多的比赛,noip就能考的越好(假的)
所以,他想知道他最多能参加几个比赛。
由于yyy是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加2个及以上的比赛。
思路:
这个题里面没有规定起始的时间,也就是根据这n组输入找出最多的线段就可以了。所以可以把输入的n组线段的右端点按从小到大排序,当右端点想同时,左端点从小到大排序。这样一来,就是成了时间结束最早的排序,然后遍历,如果下一个比赛的开始时间大于等于这一个比赛的结束时间,sum就自增好了。
代码:
#include <iostream>
#include <string>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef struct{
int a;
int b;
}qujian;
qujian s[1000005];
int cmp(qujian s1, qujian s2)
{
if (s1.b!=s2.b)
return s1.b<s2.b;
else
return s1.a<s2.a;
}
int main()
{
int n, sum=1, t;
scanf("%d", &n);
for (int i=1; i<=n; i++)
scanf("%d%d", &s[i].a, &s[i].b);
sort(s+1, s+n+1, cmp);
t=s[1].b;
for (int i=2; i<=n; i++){
if (s[i].a>=t){
sum++;
t=s[i].b;
}
}
printf("%d", sum);
return 0;
}