问题描述:
给定11个活动的开始时间和结束时间,问怎么安排能使安排的活动数最多?
贪心策略:
优先安排最早结束的活动
【优先安排最早开始的活动问题在于,当该活动的持续时间过长时,不是最优解】
【优先安排持续时间最短的活动问题在于,该活动可能跨过两个活动的结束和开始时间,不是最优解】
代码实现:
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 struct act{ 5 int start; 6 int end; 7 }acts[100]; 8 bool cmp(const act &a, const act &b) 9 { 10 11 return a.end < b.end; 12 } 13 int main(){ 14 int n; 15 cin>>n; 16 for(int i=1;i<=n;i++){ 17 cin>>acts[i].start>>acts[i].end; 18 } 19 20 sort(acts,acts+n,cmp);//按结束时间从早到晚排序 21 bool A[100];//表示第i个活动选不选 22 int j=1; 23 A[1]=true;//第一个活动肯定选 24 for(int i=2;i<=n;i++){ 25 if(acts[i].start>acts[j].end){ 26 A[i]=true; 27 j=i; 28 } 29 else A[i]=false; 30 } 31 cout<<"安排以下活动:"<<endl; 32 for(int i=1;i<=n;i++){ 33 if(A[i]==true) 34 cout<<i<<" "; 35 } 36 cout<<endl; 37 38 39 }