设有n个活动的集合e={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si< fi。如果选择了活动i,则它在半开时间区间[si,fi]内占用资源。若区间[si,fi]与区间[sj,fj]不相交,则称活动i与活动j是相容的。也就是说,当si≥fi或sj≥fj时,活动i与活动j相容。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。
思路
碰见此类问题,我们就是选择出最大的相容活动的子集合数,那么就想出解决问题的策略,我们可以将所有活动的时间段放在数轴上,从左到右进行观察,可以发现,既然都是按一个算,那么为何不选结束时间最早的呢?这样一来对后面的影响就会时最小的,而且当前的最优与后面的无任何关系。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include<iostream> #include<string> #include<cstring> #include<algorithm> using namespace std; const int MAXN=1e3+10; struct node { int l,r; bool operator < (const node &b) const{ if(b.r==r)return l<b.l; return r<b.r; } }a[MAXN]; int main() { int n,i,j; cin>> n; for(i=1;i<=n;i++) cin >>a[i].l >>a[i].r; sort(a+1,a+1+n); int res=1; for(i=1,j=2;j<=n;j++){ if(a[i].r<=a[j].l){ res++; i=j; } } cout << res << endl; } |