• HDU 1051 Wooden Sticks【LIS】


    题意:给出n个木头的重量wi,长度li,如果满足w[i+1]>=w[i]且l[i+1]>=l[i],则不用耗费另外的加工时间,问至少需要多长时间加工完这些木头。

    第一次做这一题目也没有做出来---而且也是好久以前---于是又看题解了---

    发现和将木材按两个关键字(先按重量由大到小排,如果重量相等的话则按长度由大到小排)排序后,和导弹拦截系统是一样的了,求长度的最长上升子序列。

    自己写的二分查找一直输不出结果----555555

    后来用了题解里面的lower_bound函数

    搜了一点lower_bound的用法

    和二分查找类似,lower_bound是将一个数a插入到给定的序列[first,end)中第一个不小于a的位置, 如果该序列中所有的数都小于a,那么返回end,a插入到end位置上

     1 #include<iostream>  
     2 #include<cstdio>  
     3 #include<cstring>  
     4 #include<algorithm> 
     5 #define maxn 100005 
     6 using namespace std;
     7 struct node
     8 {
     9     int l,r;
    10 } a[maxn];
    11 int cmp(node n1,node n2)
    12 {
    13     if(n1.l!=n2.l) return n1.l>n2.l;
    14     return n1.r>n2.r;
    15 }
    16 
    17 int main()
    18 {
    19     int ncase,n,i,j,len,tmp,f[maxn];
    20     scanf("%d",&ncase);
    21     while(ncase--)
    22     {
    23         scanf("%d",&n);
    24         for(i=1;i<=n;i++)
    25         scanf("%d %d",&a[i].l,&a[i].r);
    26         sort(a+1,a+n+1,cmp);
    27         len=1;
    28         f[len]=a[1].r;
    29         for(i=2;i<=n;i++)
    30         {
    31             if(a[i].r>f[len])
    32             {
    33                 len++;
    34                 f[len]=a[i].r;
    35             }
    36             else
    37             {
    38                 tmp=lower_bound(f+1,f+1+len,a[i].r)-f;
    39                 f[tmp]=a[i].r;        
    40             }
    41         }
    42         printf("%d
    ",len);
    43     }    
    44 }
    View Code
  • 相关阅读:
    [Android-NDK编译] ndk 编译 c++ 兼容性问题汇总整理
    [云计算] 001.云计算简介
    eatwhatApp开发实战(十一)
    eatwhatApp开发实战(十)
    [Unity2d系列教程] 002.引用外部DLL
    Istio Sidecar
    Kubernetes Dashborad 搭建
    Istio 1.6架构及性能
    kubeadm 搭建kubernetes集群环境
    docker 安装
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4289836.html
Copyright © 2020-2023  润新知