赞
踩
2 2 1 10 10 11 3 1 10 10 11 11 20
1 2
注意:如果上一个活动在t时间结束,下一个活动最早应该在t+1时间开始
经典贪心算法,之所以按结束时间来排列,是通过数学归纳法来确定的;
通过数学归纳法可以比较出:以开始时间排列 ,以会议时间长度排列,以结束时间排列中,按结束时间排列可以得出最优解;
按这种方法选择相容活动为未安排活动留下尽可能多的时间,即局部最优;
上源码:
- #include<cstdio>
- #include<iostream>
- #include<algorithm>
- using namespace std;
-
- struct meet
- {
- int start;
- int end;
- }a[100010];
-
- bool cmp(meet a,meet b) //按会议结束时间排列
- {
- return a.end<b.end;
- }
-
- int main()
- {
- int x;
- scanf("%d",&x);
- while(x--)
- {
- int i;
- int n;
- scanf("%d",&n);
- for(i=1;i<=n;i++)
- scanf("%d %d",&a[i].start,&a[i].end);
- a[0].start=-1;
- a[0].end=-1;
- sort(a+1,a+n+1,cmp); //排列
- int sum=1;
- int j=1;
- for(i=2;i<=n;i++) //从第二个会场开始从与前一个会场比较
- {
- if(a[i].start>a[j].end) //如果相隔时间大于1(输入都为整数),则活动数+1
- {
- j=i;
- sum++;
- }
- }
- cout<<sum<<endl;
- }
- return 0;
- }

//每天比昨天更好一些
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。