这道题我提交了好几次才过的,主要的因为TLE,因为我的算法效率是O(n^2),在网上找到了更高效的是O(n*logn).在这里我附上我两种代码.
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025
TLE代码:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
#include<iostream>
#include<algorithm>
using namespace std;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
struct node
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
int p;
int r;
};
node R[500000];
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
bool comp(node a, node b)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
if(a.p != b.p)
return a.p<b.p;
else
return a.r<b.r;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
int b[500000];
int main()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
int n,i,j,max,k=0;
while(scanf("%d",&n)!=EOF)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
for(i=0; i<n; i++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
b[i]=1;
}
for(i=0; i<n; i++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
scanf("%d %d",&R[i].p,&R[i].r);
}
sort(R,R+n,comp);
max=b[0];
for(i=1; i<n; i++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
for(j=0; j<i; j++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(R[j].p<R[i].p && R[j].r<R[i].r && b[i]<b[j]+1)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
b[i]=b[j]+1;
}
if(b[i]>max)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
max=b[i];
}
}
}
++k;
if(max>1)
printf("Case %d:\nMy king, at most %d roads can be built.\n\n",k,max);
else
printf("Case %d:\nMy king, at most %d road can be built.\n\n",k,max);
}
return 0;
}
AC代码:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
#include<iostream>
using namespace std;
const int Max=500001;
int road[Max],dp[Max];
int main()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
int n,i,hight,low,mid,len,k=0;
while(scanf("%d",&n)!=EOF)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(n==0)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
printf("Case %d:\nMy king, at most 0 road can be built.\n\n",++k);
continue;
}
for(i=0; i<n; i++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
scanf("%d %d",&hight,&low);
road[hight]=low; //有点类似哈希的做法,这里可以省掉排序
}
dp[1]=road[1];
len=1;
for(i=2; i<=n; i++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
low=0;
hight=len;
while(low<=hight)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
mid=(low+hight)/2;
if(road[i]>dp[mid])
low=mid+1;
else
hight=mid-1;
}
dp[low]=road[i];
if(low>len)
len++;
}
++k;
if(len>1)
printf("Case %d:\nMy king, at most %d roads can be built.\n\n",k,len);
else
printf("Case %d:\nMy king, at most %d road can be built.\n\n",k,len);
}
return 0;
}