看電影(貪心演算法+區間是否重合)
阿新 • • 發佈:2018-11-27
【問題描述】
小王要看電影,但是小王在m-n這段時間內很繁忙,無法看電影,但是小王今天心情非常好,能在任意沒有事情的時間內看電影。
請幫幫小王安排時間,使得他能看到最多的電影。
【輸入形式】
輸入檔案中包含多個測試資料。每個測試資料的第1行為一個正整數N(1<=N<=20),表示電影院週六那天放映的電影數;然後是2行,第2行為N部電影各自的開始時間s,第3行為N部電影各自的結束時間t,0<=s<t<=24,s和t均為整數;如果這N部電影中某些電影時間有衝突,則表示這些電影是在不同放映廳放映的;第4行為兩個整數m和n,表示小王繁忙的開始時間和結束時間,0<=m<n<=24。N = 0表示輸入結束。(繁忙期間無法看電影)
【輸出形式】
對輸入檔案中的每個測試資料,輸出小王最多能觀看到的電影數。(忽略小王輾轉放映廳的時間)
【樣例輸入】
8
0 1 4 7 9 10 13 12
7 4 9 13 15 13 19 15
5 10
0
【樣例輸出】
3
【題目分析】
這是一道‘活動安排選擇’的問題,用貪心演算法,但是在貪心演算法之前,要篩選,所有不與繁忙時間衝突的電影。
區間重合判斷方法
若電影時間與繁忙時間不衝突,可以有:電影開始時間>=繁忙結束時間 || 電影結束時間<=繁忙開始時間
進而得到電影放映時間與繁忙時間衝突的條件 電影開始時間<繁忙結束時間 && 電影結束時間>繁忙開始時間
將所有的電影按照結束時間從小到大來排。
貪心步驟
先找到第一個的電影的開始時間,假設為第i個
然後迴圈從i+1開始,找到一場電影的開始時間與當前電影的結束時間不衝突的
然後當前電影切換為剛剛找到的電影,sum++。
貪心過程中,只討論能看的電影,即不與繁忙時間衝突的電影。
程式碼如下
#include <stdio.h> #include <iostream> #include <stdlib.h> #include<algorithm> using namespace std; struct film{ int start; int end; }set[30]; bool used[30] = { 0 };//記錄哪些電影可以看,哪些不能看 int num; int m;//繁忙開始時間 int n;//繁忙結束時間 int sum = 0; int cmp(const void *a, const void *b) { return ((film *)a)->end - ((film *)b)->end; } void hoge() { int k = 99; int i = 2; for (i = 1; i <= num; i++) { if (used[i] == 1) { k = set[i].end; sum++; break; } } i++; for (; i <= num; i++) { if (used[i] == 1 && set[i].start >= k) { k = set[i].end; sum++; } } } void Rightful() { int i; for (i = 1; i <= num; i++) { if (m < set[i].end && n>set[i].start) used[i] = 0; } } int main() { //freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); while (cin >> num) { sum = 0; if (num == 0) break; int i; for (i = 1; i <= num; i++) { cin >> set[i].start; used[i] = 1;//能看為1 } for (i = 1; i <= num; i++) cin >> set[i].end; cin >> m >> n; qsort(set + 1, num, sizeof(set[1]), cmp); Rightful();//篩選不衝突的電影 hoge();//貪心 //pri(); printf("%d\n", sum); } return 0; }
還有很多東西自己要學習,加油!