有若干个活动,第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
基本思路:
把所有的活动时间按结束时间排序,
建立一个时间轴,(像一维数轴一样即可),如图
以线段的形式画在时间轴上,然后遍历所有活动。每加入一个活动,只需满足上一个占用着会场的活动结束了。
为什么要以结束时间排序呢?因为我们要尽量多的安排活动,当然希望下一个进来的活动能够成功安排进去,
那么就要求上一个活动尽量早结束。
代码:
#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;
}