链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025
转化为求最大上升子序列,我自己学这个算法的时候的理解:http://blog.csdn.net/fallenfall/article/details/11748941
写的时候注意细节,哪个road和roads还是挺坑的
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXN 500010
struct node
{
int r,p;
};
node a[MAXN];
int dp[MAXN];
int cmp(const void *a,const void *b)
{
return ((node*)a)->p-((node*)b)->p;
}
int main()
{
int n,i,cas=1;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d%d",&a[i].p,&a[i].r);
qsort(a+1,n,sizeof(node),cmp);
int ans=1;
dp[1]=a[1].r;
for(i=2;i<=n;i++)
{
int l=1,r=ans;
while(l<=r)
{
int m=(l+r)>>1;
if(a[i].r>dp[m])
l=m+1;
else
r=m-1;
}
dp[l]=a[i].r;
if(l>ans)
ans++;
}
printf("Case %d:\n",cas++);
if(ans>1)
printf("My king, at most %d roads can be built.\n\n",ans);
else
printf("My king, at most %d road can be built.\n\n",ans);
}
return 0;
}