总时间限制: 1000ms 内存限制: 65536kB

描述

大学生电影节在北大举办! 这天,在北大各地放了多部电影,给定每部电影的放映时间区间,区间重叠的电影不可能同时看(端点可以重合),问李雷最多可以看多少部电影。

输入

多组数据。每组数据开头是n(n ≤ 100),表示共n场电影。
接下来n行,每行两个整数(0到1000之间),表示一场电影的放映区间
n=0则数据结束

输出

对每组数据输出最多能看几部电影

样例输入

  1. 8
  2. 3 4
  3. 0 7
  4. 3 8
  5. 15 19
  6. 15 20
  7. 10 15
  8. 8 18
  9. 6 12
  10. 0

样例输出

  1. 3

思路

我们这么设想, 如果一个电影结束得比较早, 那李雷则有机会看更多的电影.

我们将所有电影按结束时间从小到大排序第一步选结束时间最早的那部电影, 然后每部都选和上一步选中的电影不冲突且结束时间最早的电影.

代码如下:

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. typedef struct Film {
  5. int start;
  6. int end;
  7. }Film;
  8. bool cmp(const Film& a, const Film& b) {
  9. return a.end < b.end;
  10. }
  11. int main() {
  12. /* Read data */
  13. int N;
  14. while (cin >> N && N) {
  15. Film* myFilm = new Film[N];
  16. for (int i = 0; i < N; i++) {
  17. cin >> myFilm[i].start >> myFilm[i].end;
  18. }
  19. /* Sort the film according end time */
  20. sort(myFilm, myFilm + N, cmp);
  21. /* Select film and count */
  22. int counter = 1;
  23. int prevProperFilmIndex = 0;
  24. for (int i = 1; i < N; i++) {
  25. if (myFilm[i].start >= myFilm[prevProperFilmIndex].end) {
  26. prevProperFilmIndex = i;
  27. counter++;
  28. }
  29. }
  30. cout << counter << endl;
  31. }
  32. return 0;
  33. }