目录
题目描述
假定一个有n个活动(activity)的集合S={a1,a2,....,an},这些活动使用同一个资源(例如同一个阶梯教室),而这个资源在某个时刻只能供一个活动使用。每个活动ai都有一个开始时间si和一个结束时间fi,其中0<=si<fi<=32767。如果被选中,任务ai发生在半开时间区间[si,fi)期间。如果两个活动ai和aj满足[si,fi)和[sj,fj)不重叠,则称它们是兼容的。也就说,若si>=fj或sj>=fi,则ai和aj是兼容的。在活动选择问题中,我们希望选出一个最大兼容活动集。
输入格式:
第一行一个整数n(n≤1000);
接下来的n行,每行两个整数,第一个si,第二个是fi(0<=si<fi<=32767)。
输出格式:
输出最多能安排的活动个数。
输入样例:
11 3 5 1 4 12 14 8 12 0 6 8 11 6 10 5 7 3 8 5 9 2 13
输出样例:
4
样例解释:
安排的4个活动为1 4, 5 7, 8 11和12 14。
简单来说,就是求最多可以组织多少活动,并且活动时间不能重叠。
解题思路:
利用贪心的思想,我们要使能同时组织的活动最大,只需要考虑,让活动尽早开始,尽早结束,一有活动结束马上开始最接近本次活动结束时间的活动开始时间开始。
定义排序规则,只需对结束时间进行从小到大排序即可。
详细代码:
#include<iostream> #include<algorithm> using namespace std; struct asd{ int a,b; }q[1005];//定义结构体,存储活动开始时间和结束时间 bool cmp(asd a,asd b)//定义排序规则,将结束时间小的放在前面,如果结束时间相同,则将开始时间小的放前面 { if(a.b!=b.b) return a.b<b.b; return a.a<b.a; } int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>q[i].a>>q[i].b; } sort(q+1,q+1+n,cmp);//algorithm库中自带的排序函数,对结构体进行排序需要自定义排序规则 int sum=0,dq; for(int i=1;i<=n;i++) { if(i==1)//如果i等于1则开始最快结束的一场活动即可 { dq=q[i].b; sum++;//记录活动组织的次数 } else if(q[i].a>=dq)//如果某一场活动的开始时间大于等于上一场活动的结束时间,即为下一场要开始的活动 { dq=q[i].b; sum++;//记录活动组织的次数 } } cout<<sum; }