貪心演算法(1)—— 活動安排問題 以及 電視節目問題 的區別
阿新 • • 發佈:2018-11-21
一、活動安排問題
#include <iostream> #include <algorithm> using namespace std; /* 題目型別:活動安排問題 特點:所有活動都需要進行,要求輸出所需的會場數 演算法:貪心演算法 注意事項:比較排序時,按照活動開始時間由小到大排序 原因:因為所有項都需要包括時,所以按照上述排序方式,活動排布更加緊湊,可節省會場數 樣例: (Input) 4 1 3 2 4 4 5 3 9 (Output) 2*/ struct activity { int start; int end; }act[1005]; //記錄活動的開始和結束時間 int num[1005]; //記錄各會場的結束時間 bool compare(activity a,activity b) { return a.start<b.start; } int main() { int n; //記錄活動個數 cin>>n; for(int i=0;i<n;i++) { cin>>act[i].start>>act[i].end; } sort(act,act+n,compare); //把活動按開始時間由小到大排序 int l=0; //記錄所需會場數 num[l++]=act[0].end; //第一場活動開始,記錄第一會場的結束時間 for(int i=1;i<n;i++) { bool flag=false; //記錄第i個活動的狀態——是否已安排會場 for(int j=0;j<l;j++) { if(act[i].start>=num[j]){ //若第i個活動的開始時間大於第j個會場的結束時間,則該活動可安排在該會場舉行//此時需修改第i個活動的狀態,和第j個會場的結束時間,同時跳出該迴圈,進入下一個活動 flag=true; num[j]=act[i].end; break; } } if(flag==false) num[l++]=act[i].end; //如果第i個活動與已有的所有會場進行比較後,仍未找到合適的會場,則新開一個會場用於舉辦該活動 } //當所有活動皆已完成比較後,即可輸出現有的會場數 cout<<l<<endl; return 0; }
二、電視節目問題
#include <iostream> #include <algorithm> using namespace std; /* 題目型別:電視節目問題 特點:不一定包括所有項,求能完整看完的最多節目個數 演算法:貪心演算法 注意事項:比較排序時,按照節目結束時間從小到大排序 原因:因為並不一定包含所有節目,所以按照上述排序方式,每次選擇完節目後都可以留下較多的剩餘時間 樣例: (Input) 7 1 3 3 4 2 9 3 8 10 15 5 10 4 14 (Output) 4 */ struct program { int start; int end; }pro[1005]; //記錄節目的開始和結束時間 bool compare(program a,program b) { return a.end<b.end; } int main() { int n; //記錄節目總個數 cin>>n; for(int i=0;i<n;i++) { cin>>pro[i].start>>pro[i].end; } sort(pro,pro+n,compare); //把節目按結束時間由小到大排序 int endtime=pro[0].end; //記錄看完所選節目單內節目的時間 int num=1; //記錄選擇的節目個數 for(int i=1;i<n;i++) { if(pro[i].start>=endtime){ //若第i個節目的開始時間大於節目單的結束時間,則該節目可加入到節目單 //此時需修改節目單的結束時間,以及所選節目個數 endtime=pro[i].end; num++; } } //當所有節目皆已完成比較後,即可輸出所選節目單中的節目數 cout<<num<<endl; return 0; }