总时间限制:
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;
}