有若干个活动,第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
思路
贪心算法,局部最优解
把所有的活动时间按结束时间排序,上一个活动时间结束后找到下一个活动开始时间满足要求的,遍历所有活动。每加入一个活动,只需满足上一个占用着会场的活动结束了。
为什么要以结束时间排序呢?因为我们要尽量多的安排活动,当然希望下一个进来的活动能够成功安排进去,
那么就要求上一个活动尽量早结束。
#include <stdio.h>
void bubble(int * arr,int * corr, int num)
{
int i, j;
for (i = 0; i < num - 1; i++)
{
for (j = 0; j < num - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int iTemp1 = arr[j + 1];
int iTemp2 = corr[j + 1];
arr[j + 1] = arr[j];
arr[j] = iTemp1;
corr[j + 1] = corr[j];
corr[j] = iTemp2;
}
}
}
}
int main(void)
{
int i, j;
int num = 0;
int max_num;
int act_current;
int s[100] = { 0 }, e[100] = { 0 };
scanf("%d",&num);
for (i = 0; i < num; i++)
{
scanf("%d", &s[i]);
scanf("%d", &e[i]);
}
bubble(e,s,num);
act_current = 0;
max_num = 1;
printf("%d---->%d ", s[act_current], e[act_current]);
for (j = 1; j < num; j++)
{
if (e[act_current] <= s[j])
{
act_current = j;
max_num++;
printf("%d---->%d ",s[j],e[j]);
}
}
printf("%d",max_num);
return 0;
}