HDU1025(Constructing Roads In JGShining's Kingdom)

本文提供了一道 HDU 1025 编程题的两种解题思路:一种时间复杂度为 O(n^2),另一种为 O(n*logn)。通过对比两种解法,详细解释了如何从低效代码改进到高效的 AC 代码,并附带源代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题我提交了好几次才过的,主要的因为TLE,因为我的算法效率是O(n^2),在网上找到了更高效的是O(n*logn).在这里我附上我两种代码.

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025

TLE代码:

ContractedBlock.gif ExpandedBlockStart.gif Code
#include<iostream>
#include
<algorithm>
using namespace std;

struct node
ExpandedBlockStart.gifContractedBlock.gif
{
    
int p;
    
int r;
}
;
node R[
500000];

bool comp(node a, node b)
ExpandedBlockStart.gifContractedBlock.gif
{
    
if(a.p != b.p)
        
return a.p<b.p;
    
else
        
return a.r<b.r;
}


int b[500000];
int main()
ExpandedBlockStart.gifContractedBlock.gif
{
    
int n,i,j,max,k=0;
    
while(scanf("%d",&n)!=EOF)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
for(i=0; i<n; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            b[i]
=1;
        }

        
for(i=0; i<n; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            scanf(
"%d %d",&R[i].p,&R[i].r);
        }

        sort(R,R
+n,comp);
        max
=b[0];
        
for(i=1; i<n; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
for(j=0; j<i; j++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if(R[j].p<R[i].p && R[j].r<R[i].r && b[i]<b[j]+1)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    b[i]
=b[j]+1;
                }

                
if(b[i]>max)
ExpandedSubBlockStart.gifContractedSubBlock.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代码:

ContractedBlock.gif ExpandedBlockStart.gif Code
#include<iostream>
using namespace std;
const int Max=500001;
int road[Max],dp[Max];
int main()
ExpandedBlockStart.gifContractedBlock.gif
{
    
int n,i,hight,low,mid,len,k=0;
    
while(scanf("%d",&n)!=EOF)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
if(n==0
ExpandedSubBlockStart.gifContractedSubBlock.gif        

            printf(
"Case %d:\nMy king, at most 0 road can be built.\n\n",++k);
            
continue
        }

        
for(i=0; i<n; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            scanf(
"%d %d",&hight,&low);
            road[hight]
=low;      //有点类似哈希的做法,这里可以省掉排序
        }

        dp[
1]=road[1];
        len
=1;
        
for(i=2; i<=n; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            low
=0;
            hight
=len;
            
while(low<=hight)
ExpandedSubBlockStart.gifContractedSubBlock.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;
}

 

转载于:https://www.cnblogs.com/chenjunyu/archive/2009/06/05/1497262.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值