假定一个有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>
#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;
}
测试用例
11
3 5
1 4
12 14
8 12
0 6
8 11
6 10
5 7
3 8
5 9
2 13**