活动安排
题目描述: 设有n 个活动的集合E={1,2,…,n} ,其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动 i 都有一个要求使用该资源的起始时间 Si 和一个结束时间 Fi,且 Si<Fi。如果选择了活动 i ,则它在时间区间 [Si,Fi) 内占用资源。若区间 [Si,Fi) 与区间 [Si,Fi) 不相交,则称活动 i 与活动 j 是相容的。也就是说,当 Fi<=Sj 或 Fj<=Si 时,活动 i 与活动 j 相容。选择出由互相兼容的活动组成的最大集合。 输入个数: 第一行一个整数 n; 接下来的 n 行,每## 标题行两个整数 Si 和 Fi 。 样例输入:
4 1 3 4 6 2 5 1 7
样例输出:
2
数据范围与提示:
1<=n<=1000
局部贪心策略可以得到全局最优解
AC代码:
#include<stdio.h>
#include<algorithm>
using namespace std
;
struct note
{
int s
,f
;
} q
[1010];
bool cmp(note x
,note y
)
{
if(x
.f
==y
.f
)
return x
.s
<y
.s
;
return x
.f
<y
.f
;
}
int main()
{
int n
;
scanf("%d",&n
);
int i
;
for(i
=0; i
<n
; i
++)
scanf("%d%d",&q
[i
].s
,&q
[i
].f
);
sort(q
,q
+n
,cmp
);
int k
=q
[0].f
,num
=1;
for(i
=1; i
<n
; i
++)
if(k
<=q
[i
].s
)
{
num
++;
k
=q
[i
].f
;
}
printf("%d\n",num
);
return 0;
}