贪心算法-活动安排问题(兼容任务题解)

题型描述

有 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;
}

参考资料:
1.从零开始学贪心算法
2.算法模板

posted @ 2020-03-01 20:42  dump16  阅读(1301)  评论(0)    收藏  举报