您的位置:首页 > 其它

hdu 1025 二分查找+最长上升子序列

2013-08-14 11:36 543 查看
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int N=500010;
int a
,dp
;
int LIS(int n)
{
int high,low,mid,len=1;
dp[1]=a[1];
for(int i=2;i<=n;i++)
{
low=1;

high=len;//不能是high=n;
while(low<=high)
{
mid=(low+high)/2;
if(a[i]>dp[mid])
low=mid+1;
else
high=mid-1;
}
dp[low]=a[i];
if(low>len)
len=low;
}
return len;
}
int main()
{
int A,B,N,M,t=0;
while(scanf("%d",&N)!=EOF)
{
t++;
for(int i=0;i<N;i++)
{
cin>>A>>B;
a[A]=B;//很巧妙的              }
M=LIS(N);
printf("Case %d:\n",t);

if( M==1)printf("My king, at most 1 road can be built.\n\n");//注意roads还是road
else printf("My king, at most %d roads can be built.\n\n",M);
}
system("pause");
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: