贪心算法(1)—— 活动安排问题 以及 电视节目问题 的区别
一、活动安排问题
#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; }