問題描述:
給定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 }