4151:电影节,考点:贪心策略

原题:http://bailian.openjudge.cn/practice/4151/

描述

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

输入

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

输出

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

样例输入

8
3 4
0 7 
3 8 
15 19
15 20
10 15
8 18 
6 12 
0

样例输出

3 

解法

思路:贪心算法,按照电影结束时间排序,结束时间早的在前面。每一步都选和上一部选中的电影不冲突且结束时间最早的电影。

证明:还是替换法。

 

 

 

 代码如下:

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <set>
 4 using namespace std;
 5 struct movie {
 6     int start;
 7     int end;
 8     movie(int s,int e):start(s),end(e){}
 9     bool operator <(const movie A) const {
10         return end < A.end;
11     }
12 };
13 int main() {
14     int n;
15     while (cin >> n && n != 0) {
16         multiset<movie>movies;
17         for (int i = 0; i < n; i++)
18         {
19             int s, e;
20             cin >> s >> e;
21             movies.insert(movie(s, e));
22         }
23         int counts = 0;
24         int endtime = 0;
25         multiset<movie>::iterator ii = movies.begin();
26         while (ii != movies.end()) {
27             if (ii->start >= endtime) {
28                 counts += 1;
29                 endtime = ii->end;
30             }
31             ii++;
32         }
33         cout << counts << endl;
34     }
35     return 0;
36 }

 

posted @ 2021-07-14 16:17  永远是个小孩子  阅读(82)  评论(0编辑  收藏  举报