学习小结
活动选择问题
假定一个有n个活动(activity)的集合S={a
1
,a
2
,…,a
n
},这些活动使用同一个资源(例如同一个阶梯教室),而这个资源在某个时刻只能供一个活动使用。每个活动a
i
都有一个开始时间s
i
和一个结束时间f
i
,其中0<=s
i
<f
i
<=32767。如果被选中,任务a
i
发生在半开时间区间[s
i
,f
i
)期间。如果两个活动a
i
和a
j
满足[s
i
,f
i
)和[s
j
,f
j
)不重叠,则称它们是兼容的。也就说,若s
i
>=f
j
或s
j
>=f
i
,则a
i
和a
j
是兼容的。在活动选择问题中,我们希望选出一个最大兼容活动集。
输入格式:
第一行一个整数n(n≤1000);
接下来的n行,每行两个整数,第一个s
i
,第二个是f
i
(0<=s
i
<f
i
<=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。
作者
李廷元
单位
中国民用航空飞行学院
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
源代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
struct ab{
int s;
int f;
};
int cmp(ab a,ab b)
{
return a.f<b.f;
}
int main()
{
int n,i;
ab x[1000];
while(~scanf("%d",&n))
{
if(n==0)
{
break;
}
for(i=0;i<n;i++)
{
scanf("%d %d",&x[i].s,&x[i].f);
}
sort(x,x+n,cmp);
int sum=1;
int fina=x[0].f;
for(i=1;i<n;i++)
{
if(x[i].s>=fina)
{
sum++;
fina=x[i].f;
}
}
printf("%d\n",sum);
}
return 0;
}