简单DP
http://acm.timus.ru/problem.aspx?space=1&num=1203
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int f[30001];//下标表示结束点 所存数据为最晚开始的那个
int ans[30001];//ans[i]表示到这个点时最多参加数
int main()
{
int n,i,l,T;
cin>>n;
for(i=0;i<30001;i++)
f[i]=i;//f[i]==i 表示没有从此点结束的会议
while(n--)
{
cin>>l>>i;
if(l>f[i]||f[i]==i)
f[i]=l;
}
ans[0]=0;
T=0;
for(i=1;i<30001;i++)
{
if(f[i]!=i)//两种情况
{
ans[i]=max(ans[f[i]-1]+1,ans[i-1]);
}
else
{
ans[i]=ans[i-1];
}
if(ans[i]>T)
T=ans[i];
}
cout<<T<<endl;
return 0;
}