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 }

 

 
posted @ 2018-05-09 11:34  霜雪千年  阅读(1363)  评论(0编辑  收藏  举报