题目背景
快 noip 了,yyy 很紧张!
题目描述
现在各大 oj 上有 nn 个比赛,每个比赛的开始、结束的时间点是知道的。
yyy 认为,参加越多的比赛,noip 就能考的越好(假的)。
所以,他想知道他最多能参加几个比赛。
由于 yyy 是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加 22 个及以上的比赛。
输入格式
第一行是一个整数 nn ,接下来 nn 行每行是 22 个整数 a_{i},b_{i}ai,bi ( a_{i}<b_{i}ai<bi ),表示比赛开始、结束的时间。
输出格式
一个整数最多参加的比赛数目。
输入输出样例
输入 #1复制
3 0 2 2 4 1 3
输出 #1复制
2
说明/提示
对于 20\%20% 的数据, n \le 10n≤10。
对于 50\%50% 的数据, n \le 10^3n≤103。
对于 70\%70% 的数据, n \le 10^{5}n≤105。
对于 100\%100% 的数据, 1\le n \le 10^{6}1≤n≤106 , 0 \le a_{i} < b_{i} \le 10^60≤ai<bi≤106。
【思路】
首先按每场考试的结束时间排序(最先结束的排在前面)。
遍历排序好的数组,使用上一次参加考试的结束时间与每场考试的开始时间进行比较,如果开始时间大于等于上一次考试的结束时间。就参加正常考试。然后用这场考试的结束时间继续查找可以参加的考试。
【代码】
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e6 + 5;
struct Exam {
int begin, end;
bool operator<(const Exam &e) const {
return end < e.end;
}
};
Exam a[N];
int n;
int cnt;
int main() {
cin >> n;
for(int i = 0 ; i < n; i++) {
scanf("%d%d", &a[i].begin, &a[i].end);
}
sort(a, a + n);
int end = a[0].end;
cnt = 1;
for(int i = 1; i < n; i++) {
if(a[i].begin >= end) {
cnt++, end = a[i].end;
}
}
cout << cnt << endl;
return 0;
}