【題面】
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
【思路】
貪心,按照時間順序從前向後選取去看什麼電影。如果兩個電影a和b,a的終止時間早於b的終止時間,那麼選a之後還能看的電影一定不劣於選b之後還能看的電影。
而又因爲我們是從前向後按照時間順序去決定電影的選取的,所以我們不需要考慮之前的電影的選取情況。即只要在當前的狀態下,存在兩個電影,它們都可以被選取爲下一個被看的電影,那麼我們就選結束時間早的那個。
那我們不妨去看每一個時刻結束時間最早的那個電影,如果這個電影可以看,那麼就去看。我們可以證明這種看電影的策略不劣於任何其他的策略。
這樣的話,直接把所有的電影按照右端點從小到大排序,再一個一個驗證當前這個電影的時間是否與之前選取的電影時間相沖突就可以了。具體做法,可以記錄一下當前看的最後一個電影的結束時間,把它和下一個電影的開始時間相比較。
【代碼】
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn (100 + 10)
struct film{
int L, R;
}ns[maxn];
bool cmp(film a, film b){
return a.R < b.R;
}
int main(){
int n;
while(scanf("%d", &n) && n){
for(int i=1; i<=n; i++)
scanf("%d%d", &ns[i].L, &ns[i].R);
sort(ns + 1, ns + n + 1, cmp);
int tnow = 0, cnt = 0;
for(int i=1; i<=n; i++){
if( tnow<=ns[i].L ){
cnt ++;
tnow = ns[i].R;
}
}
printf("%d\n", cnt);
}
return 0;
}
2018.1.23 GGN