n不妨用Begin[i]和End[i]表示事件i的开始时刻和结束时刻。则原题的要求就是找一个最长的序列a1<a2<…<an,满足:
Begin[a1]<End[a1]<=…<= Begin[an]<End[an]
可以证明,如果在可能的事件a1<a2<…<an中选取在时间上不重叠的最长序列,那么一定存在一个包含a1(结束最早)的最长序列。
(证明:略)
#include<stdio.h>
int main()
{
int star[101],end[101];
int i,j,sum,p,n,t,k;
while(scanf("%d",&n)!=EOF && n)
{
for(i=0;i<n;i++)
scanf("%d%d",&star[i],&end[i]);
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(end[i]>end[j])
{
t=star[i];
star[i]=star[j];
star[j]=t;
k=end[i];
end[i]=end[j];
end[j]=k;
}
p=0;
sum=0;
for(i=0;i<n;i++)
if(star[i]>=p)
{
p=end[i];
sum++;
}
printf("%d\n",sum);
}
return 0;
}