解析:
本题采用贪心策略。
用begin[] end[]分别表示活动的开始时刻和结束时刻。每一个事件的开始时刻一定小于结束时刻。即begin[i] < end[i].
例如三个事件a.b.c(a < b < c),即有begin[a] < end[a] <=begin[b] < end[b]<=begin[c] < end[c]。
具体讲:
1 。第一要选取的事件是最早结束的事件。
2。下一个要选取的事件,必须是上一个事件结束后开始事件中最早结束的事件。
#include <stdio.h>
int main()
{
int num;
while(scanf("%d",&num) != EOF)
{
int begin[1000],end[1000],sum = 0,i,j,temp1,temp2;
int timestar = 0;
for(i = 0;i < num;i++)
{
scanf("%d %d",&begin[i],&end[i]);
}
for(i = 0;i < num-1;i++)
for(j = 0;j < num-1-i;j++)
{
if(end[j] > end[j+1])
{
temp1 = begin[j];
begin[j] = begin[j+1];
begin[j+1] = temp1;
temp2 = end[j];
end[j] = end[j+1];
end[j+1] = temp2;
}
}/*
采用冒泡排列法将时间按照
时间结束的顺序从大到下排列
*/
i = 0;
while(i < num)
{
if(begin[i] >= timestar)/*比较结束事件的时间与下
一个开始时间是否符合条件*/
{
timestar = end[i];
sum += 1;
i++;
}else
{
i++;
}
}
printf("%d\n",sum);
}
}