假定一个有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。
#include<iostream>
#include<algorithm>
#define MAXN 1000
using namespace std;
struct Goods {
int s;
int e;
}goods[MAXN];
bool comp(Goods a, Goods b)
{
return a.e <= b.e;
}
void input(int n)
{
int i;
for (i = 0; i <n; i++)
cin >> goods[i].s >> goods[i].e; //输入活动开始和结束的时间
}
void select(int n)
{
int sum = -1;
int count = 0;
for (int i = 0; i < n; i++)
{
if (goods[i].s >= sum)
{
count++;
sum = goods[i].e;
}
}
cout << count << endl;//能安排的活动个数
}
int main()
{
int n;//活动的总数
while (cin >> n)
{
if (n == 0)break;
input(n);
sort(goods, goods+n, comp);//按活动结束时间从小到大排序
select(n);
}
return 0;
}