题目描述:
现在各大oj上有n个比赛,每个比赛的开始、结束的时间点是知道的。
 yyy认为,参加越多的比赛,noip就能考的越好(假的)
 所以,他想知道他最多能参加几个比赛。
 由于yyy是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加2个及以上的比赛。
思路:
 这个题里面没有规定起始的时间,也就是根据这n组输入找出最多的线段就可以了。所以可以把输入的n组线段的右端点按从小到大排序,当右端点想同时,左端点从小到大排序。这样一来,就是成了时间结束最早的排序,然后遍历,如果下一个比赛的开始时间大于等于这一个比赛的结束时间,sum就自增好了。
代码:
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;
}                
                










