贪心算法基础之活动时间安排(一)安排 51nod 贪心教程

有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动?

输入

第1行:1个数N,时间段的数量(2 <= N <= 10000)
第2 - N + 1行:每行2个数,时间段的起点和终点(-10^9 <= S,E <= 10^9)

输出

输出最多可以选择的时间段数量。

输入示例

3
1 5
2 3
3 6

输出示例

2

原网站 51nod 给出的题解非常详细,这里就不多啰嗦了。去这里看:

https://www.51nod.com/tutorial/course.html#!courseId=14

基本思路:

把所有的活动时间按结束时间排序,

建立一个时间轴,(像一维数轴一样即可),如图

《贪心算法基础之活动时间安排(一)安排 51nod 贪心教程》

以线段的形式画在时间轴上,然后遍历所有活动。每加入一个活动,只需满足上一个占用着会场的活动结束了。

为什么要以结束时间排序呢?因为我们要尽量多的安排活动,当然希望下一个进来的活动能够成功安排进去,

那么就要求上一个活动尽量早结束。

代码:

#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
struct node{
	int b,e;
}a[100100];
bool cmp(node a,node b)
{
	return a.e<b.e;
 } 
int main()
{
	int N;
	while(~scanf("%d",&N))
	{
		for(int i=0;i<N;i++)
		{
			scanf("%d%d",&a[i].b,&a[i].e);
		}
		sort(a,a+N,cmp);//从小到大排序(按结束时间) 
		int count=1;//成功安排进去的活动数目 
		int last=0;//记录上一个活动的序号 
		for(int i=1;i<N;i++)
		{
			if(a[i].b>=a[last].e)//只要上一个活动结束了,现在的活动就可以进入 
			{
				last=i;
				count++;
			}
		}
		printf("%d\n",count);
	}
	return 0;
}

    原文作者:贪心算法
    原文地址: https://blog.csdn.net/winter2121/article/details/71512189
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞