贪心算法-活动安排问题(兼容任务题解)
题型描述
有 n 个活动需要使用同一资源,且同一时段内只有一个活动能使用该资源。每个活动 i 都有起始时间 si 和结束时间 ei (si < ei),如果安排活动 i,则它在时间区间 [si,ei) 内占用资源。若区间 [si, ei) 与区间 [sj,ej) 不相交,则称活动 i 与活动 j 相容。
活动安排问题即,安排活动使尽可能多的活动相容。本质为,在所给的活动集合中选出最大的相容活动子集合。
解题思路
每次都选择结束时间最早的活动,为未安排活动留下尽可能多的时间。该贪心算法的本质是使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。
(贪心算法 是指在对问题求解时,不从整体最优上加以考虑,总是做出某种意义上的局部最优解。)
解题步骤
1.将活动按结束时间单调递增排序;
2.依次选择结束时间最早的活动,并计数。
实例题解
兼容问题
题目描述
设有 n 个任务,其中每个任务有一个起始时间 si 和一个结束时间 ei ,且 si < ei ,同一时间只能完成一个任务。如果选择了任务 i ,则它在时间区间 [si ,ei) 内占用资源。若区间 [si,ei) 与区间 [sj, ej)不相交,则称任务 i 与任务 j是相容的。
那么,对于给定的任务时间区间,能互相兼容的最大任务个数是多少呢?输入格式
第一行一个整数 n (1<=n<=1000);
接下来 n 行,每行两个整数 si 和 ei 。输出格式
互相兼容的最大任务个数。
完整代码
#include<stdio.h>
int main(){
int n,i,j,number=1,t,final;
int s[1200],e[1200];
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d%d",&s[i],&e[i]);
}
for(i=0;i<n-1;i++){
for(j=0;j<n-i-1;j++){
if(e[j]>e[j+1]){
t=s[j];
s[j]=s[j+1];
s[j+1]=t;
t=e[j];
e[j]=e[j+1];
e[j+1]=t;
}
}
}
final=e[0];
for(i=1;i<n;i++){
if(s[i]>=final){
number++;
final=e[i];
}
}
printf("%d",number);
return 0;
}

浙公网安备 33010602011771号