百練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則資料結束輸出...