Problem Description
已知N=12个事件的发生时刻和结束时刻(下表,并已按结束时刻升序排序)。一些在时间上没有重叠的事件可以构成一个事件序列,如{2,8,10},事件序列包含的事件数目,称为该事件序列的长度。编程找出一个最长的事件序列。
Input Description
第一行输入一个整数0<N<1000,表示事件的数量。
接下来输入N行,输入两个数begin[i],end[i],分别表示时间的发生时刻与结束时刻,0<=i<N。
Output Description
输出最长的时间序列。
Sample Input
12 1 3 3 4 0 7 3 8 2 9 5 10 6 12 4 14 10 15 8 18 15 19 15 20
Sample Output
{0,1,5,8,10}
个人分析:
1.解决该问题的方法思想就是贪心算法,题目规定了每次给出的数据已按结束时刻升序排序,故我们仅需要进行选择即可。
2.每次选择都选择时间段结束最早的,只有结束时间最早,才为后面的活动安排留出更多的时间,这样选择的数量才是最多的。
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
int begin[n], end[n];
for(int i = 0; i < n; i++)
{
scanf("%d %d", &begin[i], &end[i]);
}
int take[n];
for(int i = 0; i < n; i++)
{
take[i] = 0;
}
int i = 0;
int time = 0;
while(i < n)
{
if(begin[i] >= time)
{
take[i] = 1;
time = end[i];
}
i++;
}
printf("{");
int flag = 0;
for(int i = 0; i < n; i++)
{
if(take[i] == 1)
{
if(flag == 0)
{
printf("%d", i);
flag = 1;
}
else if(flag == 1)
{
printf(",%d", i);
}
}
}
printf("}\n");
return 0;
}