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 }