百练4151电影节

百练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

问题分析:将每一部电影按照结束时间从早到晚排序。先选择第一部电影,之后每次都选择结束时间比前一次晚、
而且不冲突(即开始时间晚于或等于前一部的开始时间)的电影 
为什么是按照结束时间排序?可以这么想。因为我们要最大化的是观看电影的数量。我们要优先看那些结束时间早的电影,因为它结束的越是早,我们之后就越是能够留有
更多的时间看其他电影。开始时间早不早无所谓,一部电影开始时间早,并不能保证我们之后还会有更多时间看其他电影。设想一种极端情况
一部电影从0时刻开始,在1000时刻结束,如果按照开始时间优先选,那必然会选择这一部电影而且以后的所有电影都不会被选择,那么总共就只能看这一部电影了。这显然不是最优解。 

证明:
替换法。假设用贪心法挑选的电影序列为:
a 1 ,a 2 ....
不用此法挑选的最长的电影序列为:
b 1 ,b 2 ...
现可证明,对任意i, b i 均可以替换成ai

用S(x)表示x开始时间,E(x)表示x结束时间,则:
1) b 1 可以替换成a 1 ,因为E(a 1 )<=E(b 1 )
2) 若可以找到a i ,满足E(a i )<= E(b i )且a i 可以替换b i ,则存在
E(a i+1 )<=E(b i+1 )且a i+1 可以替换b i+1
证:
因为 E(a i )<= E(b i ) 且E(b i ) <= S(b i+1 )
则:E(a i ) <= S(b i+1 )
a i+1 是所有S(x)>=E(a i )的x中,E(x)最小的
S(b i+1 )>=E(b i )>=E(a i ),所以E(b i+1 )>= E(a i+1 )
因此用a i+1 替换b i+1 不会对后续造成影响,替换可行 

#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 100+10;
struct film{
	int s,e;
	bool operator < (const film &f) const {
		return e < f.e; 
	}
}a[MAXN];

int main(){
	int n;
	while(true){
		cin >> n;
		if(n == 0)
			break;
		for(int i = 0;i<n;i++){
			cin >> a[i].s >> a[i].e;
		}
		
		sort(a,a+n);
		int res = 1;
		film lastf = a[0];
		for(int i = 1;i<n;i++){
			if(a[i].s >= lastf.e){
				res++;
				lastf = a[i];
			}
				
		} 
		
		cout << res << endl;
	}
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值