8 solutions
-
0
P1087. 「一本通 1.1 例 1」活动安排 —— 贪心算法
题意概述
给定多个活动,每个活动有自己的开始时间和结束时间,每个活动的占用同一资源,也就是说,活动时间不可发生重叠。 再翻译一下就是,前一个活动的结束必须早与后一个活动的开始时间。
题意分析
这里很多时候我们会直接去想着用开始时间排序,然后再把开始时间相同的活动安结束时间再排序,最后再比较判断(我试了,好像不行) 好我们来看看使用贪心的思维怎么去解这个题,我们这里要反过来想,是否可以按照结束时间排序。没错就是按照结束时间从小到大排序,就可以避免对每个活动的时长的考虑。排序完后的结果再按照前一个活动的结束时间必须小于后一个活动的开始时间来挑选活动。
- 将每个活动以结束时间为关键字排序
- 按照题意挑选活动
可行代码
-
-1
分析: 创建一个集合结构体,储存开始时间与结束时间。将结构体进行从小到大进行排序,然后将第一次结束时间拿出来,从第二个元素开始循环比较,如果开始时间大于结束时间就++,更新结束时间 代码: #include #include #include using namespace std; struct set{ int s; int f; bool operator<(const set &rhs)const{ return f<rhs.f; } }; int main() { int n; set a[1005]; memset(a,0,sizeof(a)); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&a[i].s,&a[i].f); } sort(a+1,a+1+n); int ans=1; int cnt=a[1].f; for(int i=2;i<=n;i++) { if(a[i].s>=cnt) { ans++; cnt=a[i].f; } } printf("%d",ans); return 0; }
- 1
Information
- ID
- 91
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 6
- Tags
- # Submissions
- 214
- Accepted
- 64
- Uploaded By