ACM_区间调度问题(贪心)

Meetings 系列一

Time Limit: 2000/1000ms (Java/Others)

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 }

猜你喜欢

转载自www.cnblogs.com/acgoto/p/9013241.html
今日推荐