北大 OJ 4151 电影节(贪心)

总时间限制: 

1000ms

内存限制: 

65536kB

描述

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

输入

多组数据。每组数据开头是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

来源

Guo Wei

解题思路:

以前三个数据为例:[1,3], [3,4], [0,7]。得如果要看尽可能多的电影,要先选结束时间最早的。

由题目知区间叠加的不能看,尾首(一个区间的尾是另一区间的首)相同的可以看,那么只需要对区间的尾(电影结束时间)从小到大进行排序,判断下一步影片的开始时间时候在本部影片结束之后即可。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct film
{
    int s,e;
    bool operator < (const film & c) const{
        return e < c.e;
    }
}films[105];
int main()
{
    int n;
    while(~scanf("%d",&n) && (n!=0)){
        int num = 1;
        for(int i = 0;i < n;i++){
            scanf("%d %d",&films[i].s,&films[i].e);
        }
        sort(films,films+n);
        int endtime = films[0].e;
        for(int i = 1;i<n;i++){
            if(films[i].s >= endtime){
                num++;
               endtime = films[i].e;
            }
        }
        printf("%d\n",num);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42018521/article/details/81504849
今日推荐