百練4151電影節

2021-09-11 07:24:56 字數 1525 閱讀 9982

百練4151電影節

大學生電影節在北大舉辦! 這天,在北大各地放了多部電影,給定每部電影的放映時間區間,區間重疊的電影不可能同時看(端點可以重合),

問李雷最多可以看多少部電影。

輸入多組資料。每組資料開頭是n(n<=100),表示共n場電影。

接下來n行,每行兩個整數(0到1000之間),表示一場電影的放映區間

n=0則資料結束

輸出對每組資料輸出最多能看幾部電影

樣例輸入

83 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 #include using namespace std;

const int maxn = 100+10;

struct film

}a[maxn];

int main()

sort(a,a+n);

int res = 1;

film lastf = a[0];

for(int i = 1;i= lastf.e)

} cout << res << endl;

}}

百練 4151 電影節(貪心)

總時間限制 1000ms 記憶體限制 65536kb 描述大學生電影節在北大舉辦 這天,在北大各地放了多部電影,給定每部電影的放映時間區間,區間重疊的電影不可能同時看 端點可以重合 問李雷最多可以看多少部電影。輸入多組資料。每組資料開頭是n n 100 表示共n場電影。接下來n行,每行兩個整數 0到...

百練OJ 4151 電影節

總時間限制 1000ms 記憶體限制 65536kb 描述 大學生電影節在北大舉辦 這天,在北大各地放了多部電影,給定每部電影的放映時間區間,區間重疊的電影不可能同時看 端點可以重合 問李雷最多可以看多少部電影。輸入 多組資料。每組資料開頭是n n 100 表示共n場電影。接下來n行,每行兩個整數 ...

貪心百練4151MOOC電影節

大學生電影節在北大舉辦 這天,在北大各地放了多部電影,給定每部電影的放映時間區間,區間重疊的電影不可能同時看 端點可以重合 問李雷最多可以看多少部電影。輸入多組資料。每組資料開頭是n n 100 表示共n場電影。接下來n行,每行兩個整數 0到1000之間 表示一場電影的放映區間 n 0則資料結束輸出...