HDU1025 Constructing Roads In JGShining's Kingdom

原题地址:戳进来

这道题目就是说有两条平行线,第一条线上是rich城市,第二条线上是poor城市,要求把相同数字的城市相连,但是不能出现交叉,问最多能连几条线。

这道题目我一直感觉有问题,有的人说输入本身就是有序的不用排序,也有的说输入无序,要按照poor城市的升序排rich城市,然后求rich城市序列中的最长上升子序列,我贴出这道题的目的不是这道题本身,而是想说明求LIS的动态规划加二分的方法,时间复杂度是O(N*logN),如果不知道请转最长上升子序列 LIS,如果你用普通的动态规划的方法做我打一百个保票你会超时,不信你去试一下,题目链接在上面,贴出我的AC代码。
#include
    
    
     
     
#include
     
     
      
      
#include
      
      
       
       
#include
       
       
        
        
#include
        
        
          #include 
         
           #include 
          
            #include 
           
             #include 
            
              #include 
             
               #include 
               #include 
               
                 #include 
                
                  #include 
                 
                   #include 
                  
                    using namespace std; #define MAXN 500010 int d[MAXN]; struct node { int r; int p; }a[MAXN]; int cmp(const node&a,const node&b) { return a.p 
                   
                     >1; if(n>d[mid]&&n 
                    
                      d[mid]) l=mid+1; else r=mid-1; } return 0; } int main() { int n,count=0; while(cin>>n) { count++; for(int i(1);i<=n;i++) cin>>a[i].r>>a[i].p; sort(a+1,a+1+n,cmp); int len=1,i,j; d[1]=a[1].r; for(i=2;i<=n;i++) { if(a[i].r>d[len]) { len++; d[len]=a[i].r; } else { j=Binsearch(a[i].r,d,1,len)+1; d[j]=a[i].r; } } if(len==1) { cout<<"Case "< 
                     
                       <<":"< 
                      
                        <<"My king, at most "< 
                       
                         <<" road can be built."< 
                         
                        
                       
                      
                     
                    
                   
                  
                 
                
              
             
            
           
          
        
       
       
      
      
     
     
    
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值