贪心算法之会议安排
因不考虑每个会议带来的收益问题,只需要考虑如何安排最多的会议,因此只需要根据会议的结束时间排序,优先选择会议结束时间更早的。并用left记录上一个会议的结束时间,下一个会议的开始时间需要大于等于left.
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 struct Meet{ 5 int beg; 6 int end; 7 }; 8 bool compare(Meet x,Meet y) 9 { 10 if(x.end==y.end) 11 return x.beg>y.beg; 12 return x.end<y.end; 13 } 14 int meetingasignment(Meet a[],int end_time,int n) 15 { 16 int left=a[0].end; 17 int ans=1;//计算课安排的会议数量 18 for(int i=1;i<n;i++) 19 { 20 if((left<=a[i].beg)&&(a[i].end<=end_time)) 21 { 22 ans++; 23 left=a[i].end; 24 } 25 else 26 continue; 27 } 28 return ans; 29 30 } 31 32 int main () 33 { 34 int n; 35 int end_time; 36 Meet oneday[100]; 37 cout<<"请输入待安排会议数量:"; 38 cin>>n; 39 cout<<"请输入一天会议的结束时间:"; 40 cin>>end_time; 41 cout<<"请输入会议的开始与结束时间"; 42 for(int j=0;j<n;j++) 43 { 44 cin>>oneday[j].beg>>oneday[j].end; 45 } 46 sort(oneday,oneday+n,compare); 47 int number=meetingasignment(oneday,end_time,n); 48 cout<<"一天可安排的最大会议数为:"<<number; 49 return 0; 50 }
测试数据:
n=10;end_time=18;
会议开始结束时间:3 6 1 4 5 7 2 5 5 9 3 8 8 11 6 10 8 12 12 14