设有n个活动的集合E={1, 2, ..., n},其中,每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i 都有一个要求使用该资源的起始时间 si 和一个结束时间 fi ,且si < fi。如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。也就是说,当 si ≥ fj 或 sj ≥ fi 时,活动 i 与活动 j 相容。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。
分析:在当前活动找下一个最早结束时间且相容的活动,这样总能剩下最多时间来安排更多的活动。符合贪心的思想。
代码:
#include <cstdio>
#include <algorithm>
#include <stdlib.h>
using namespace std;
struct _time
{
int _begin;
int _end;
}activity[1005];
int cmp(const void *a, const void *b)
{
return (*(struct _time*)a)._end - (*(struct _time*)b)._end;
}
int main()
{
int t, n;
scanf( "%d", &t);
for( int k = 1; k <= t; k++)
{
scanf("%d", &n);
for( int i = 0; i < n; i++ )
scanf("%d%d", &activity[i]._begin, &activity[i]._end);
qsort(activity, n, sizeof(activity[0]), cmp);
int cnt = 0, f = -1;
for( int i = 0; i < n; i++ )
{
if( f <= activity[i]._begin )
{
cnt ++;
f = activity[i]._end;
}
}
printf("Case %d: %d\n",k,cnt);
}
return 0;
}