ACM_区间调度问题(贪心)
Meetings 系列一
Problem Description:
多年之后的广财ACM编协如日中天,下系多个部门,且编协成员几近过百。这一次,为了庆祝ACM编协近年飞速的发展,各部门都决定在同一天召开会议。请注意:这次由于资源紧张,仅申请到一个报告厅。现在需要你给出安排方案,使得同一天24小时内举行的会议场次尽可能多。
为了简化问题,作如下规定:
(1)每一场会议M(a,b)表示从a时刻开始,b时刻结束(其中,a,b都为整数且8 <= a < b <= 20);
(2)同一时段内报告厅仅允许一个部门进行开会,不同部门交接时可忽略不同场次交换耗费的时间。
Input:
输入包含多组测试数据,每组数据第一行输入整数n(0<n<=20)表示一共有n场会议要安排。下面n行依次输入每一场会议的开始跟结束时刻a,b。
Output:
每一组测试输出可以安排的场次的最大数目,占一行。
Sample Input:
3 12 15 12 13 14 18 5 11 12 13 18 18 20 13 16 16 17
Sample Output:
2 4
解题思路:贪心策略:将所有区间按右端点坐标(结束时间)从小到大排序,顺序处理每个区间。如果它与当前已选的所有区间都没有重叠,则选择该区间,否则不选。注意:起始时间和结束时间在8-20范围内。
算法证明--->博主:阳光日志
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct NODE{ 4 int st,ed; 5 }node[21]; 6 bool cmp(NODE x,NODE y){ 7 return x.ed<y.ed; //按结束时间早的升序排 8 } 9 int main() 10 { 11 int n,num,k,t,s,e; 12 while(cin>>n){ 13 k=-1; 14 for(int i=1;i<=n;++i){ 15 cin>>s>>e; 16 if(s>=8 && e<=20){node[++k].st=s;node[k].ed=e;} 17 } 18 sort(node,node+k+1,cmp); 19 num=t=0; 20 for(int i=0;i<=k;++i) 21 if(t<=node[i].st){num++;t=node[i].ed;} 22 cout<<num<<endl; 23 } 24 return 0; 25 }
也可以使用STL中的pair<int,int>。AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int n,num,k,t,s,e;pair<int,int> itv[21]; 6 while(cin>>n){ 7 k=-1; 8 for(int i=1;i<=n;++i){ //second记录起始时间,first记录结束时间 9 cin>>s>>e; //这样就按照结束时间早的升序排 10 if(s>=8 && e<=20){itv[++k].second=s;itv[k].first=e;} 11 } 12 sort(itv,itv+k+1);num=t=0; 13 for(int i=0;i<=k;++i) 14 if(t<=itv[i].second){num++;t=itv[i].first;} 15 cout<<num<<endl; 16 } 17 return 0; 18 }