收获:
1:dp+二分 NlogN的复杂度
2:二分法的使用
3:dp[i]记录的是上升最大序列为i的最小数
4:注意格式 最后是要输出两个空行
#include <iostream>
#include <map>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=500001;
int num[maxn];
int T;
int main()
{
while(cin >> T && T)
{
map<int,int> Map;
memset(num,0,sizeof(0));
int s,t,
i,j;
int maxnum=0;
for(i=1;i<=T;i++){
scanf("%d %d",&s,&t);
Map.insert(pair<int,int>(s,t));
}
// map<int,int>::iterator it;
for(i=1;i<=T;i++){
for(j=1;j<i;j++){
if(Map[i]>Map[j] && num[i]<num[j]){
num[i]=++num[j];
if(maxnum<num[i]){
maxnum=num[i];
}
}
}
}
++maxnum;
cout << "My king, at most " << maxnum;
if(1==maxnum){
cout << " road can be built." << endl;
}else{
cout << " roads can be built" << endl;
}
Map.clear();
}
return 0;
}