zoukankan      html  css  js  c++  java
  • 1689 建造高塔

    1689 建造高塔

     

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 钻石 Diamond
     
     
     
    题目描述 Description
    n有n种石块,石块能无限供应。每种石块都是长方体,其中第i种石块的长、宽、高分别为li、wi、hi。石块可以旋转,使得其中两维成为长度和宽度,第三维成为高度。如果要把一个石块放在另一个石块上面,必须保证上面石块的长和宽都分别严格小于下面石块的长和宽。这意味着,即使两块长宽相同的石块也不能堆砌起来。
    现在神犇想知道,最多能用上多少块石头呢?


     
    输入描述 Input Description

    第一行,N; 
    以下N行,每行三个数,表示第i种石头的长宽高。

    输出描述 Output Description

    一个整数,表示最多能用上多少块石头。

    样例输入 Sample Input
    3
    1 1 1
    2 2 2
    3 3 4
    样例输出 Sample Output

    3

    数据范围及提示 Data Size & Hint

    N≤50000,其余数字≤maxlongint。

    分类标签 Tags 点此展开 

     
     
    提供几组数据(样例太水了)
    Point1
    5
    38855 19141 16949
    31471 40006 27231
    20991 1909 27120
    45405 18298 48053
    16192 32360 4671
    正确答案
    > 6
    
    Point2
    49
    31567 25585 1484
    30138 35885 27814
    1946 24590 28784
    7914 9961 20005
    48363 34524 12425
    48648 43557 12123
    38778 20344 35305
    44089 18685 26186
    22033 41923 36829
    8764 10946 37483
    2691 48431 22727
    23915 38466 41743
    8122 6795 41839
    12885 17369 35943
    28549 2817 44764
    13386 45432 1026
    22337 48109 1279
    3031 42628 1206
    34534 11440 38112
    30292 30721 2722
    25125 15253 20428
    16684 2320 43043
    23711 48835 21518
    30524 38326 49077
    6473 44323 25053
    41342 36590 11419
    21870 30291 20678
    29368 34738 4434
    35269 15948 906
    46656 49845 43618
    36644 38000 34666
    24914 26227 23254
    24724 14968 33826
    18853 42268 13086
    31126 684 9635
    42377 28174 34321
    1669 23667 22501
    31429 32435 2456
    9854 3388 19212
    26624 9578 28696
    28653 30013 32537
    1965 12969 38319
    45129 10892 21843
    8876 7362 31091
    24994 34284 47271
    31118 11781 10535
    5321 7178 49997
    7608 47670 28078
    19631 9944 49069
    正确答案
    > 26
    
    Point3
    48
    44843 2943 31140
    11506 43625 31345
    37202 27528 44682
    47653 17756 21963
    27917 43398 31410
    49487 45901 6954
    37773 49233 40891
    21382 21946 15848
    48177 27545 15295
    41580 19827 28072
    19359 34396 47306
    45209 38021 37165
    19846 43888 31501
    31659 12360 35133
    2499 17511 7875
    39259 49943 34727
    22305 15907 33602
    10466 37455 17186
    20854 22583 13222
    34027 22219 43496
    14427 15312 41434
    46873 35790 22914
    32476 37011 17463
    16315 7265 18452
    4224 49080 2513
    2574 13647 49867
    30794 17206 36320
    19972 49519 7302
    41360 26352 43756
    11203 23457 13794
    3867 43983 35628
    33585 35052 16298
    32208 36482 33775
    33277 23494 40638
    1790 15859 44299
    15936 26821 34962
    22488 18571 22646
    22549 38741 7434
    29844 43304 6163
    48982 5418 15987
    9428 44044 44463
    17177 10264 31861
    24580 27513 31788
    11738 25952 15752
    40949 26315 21372
    12681 49725 33075
    34521 34982 16625
    30231 47599 25228
    正确答案
    > 28

    题解:

    把一组li、wi、hi拆成6组l,r(长,宽||显然只与这两项有关)//题目说有n种石块,石块能无限供应

    按l升序排列(l相等时按r的降序排列)

    nlogn跑一遍r的最长严格上升子序列,就好了

    AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define N 50010
    inline const int read(){
        register int x=0,f=1;
        register char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    struct node{
        int l,r;
        bool operator < (const node &x) const{
            if(l==x.l) return r>x.r;
            return l<x.l;
        } 
    }e[N<<3];
    int n,cnt,len,b[N<<3];
    void LIS(){
        b[len=1]=e[1].r;
        for(int i=2;i<=cnt;i++){
            if(e[i].r>b[len]){
                b[++len]=e[i].r;
            }
            else{
                int pos=lower_bound(b+1,b+len+1,e[i].r)-b;
                b[pos]=e[i].r;
            }
        }
        printf("%d
    ",len);
    }
    int main(){
        n=read();
        for(int i=1,x,y,z;i<=n;i++){
            x=read();y=read();z=read();
            e[++cnt]=(node){x,y};
            e[++cnt]=(node){y,x};
            e[++cnt]=(node){x,z};
            e[++cnt]=(node){z,x};
            e[++cnt]=(node){z,y};
            e[++cnt]=(node){y,z};
        }
        sort(e+1,e+cnt+1);
        LIS();
        return 0;
    }
  • 相关阅读:
    day01-html
    Word中划线的方法(五种)
    关于获取请求参数并处理显示的总结
    确定目标,把握时间,创造机会,努力加油!(关于大三下学期人生规划浅谈)
    重载运算符(一个例子)
    关于连接数据库的那点总结(感觉挺好的)
    Ribbon负载均衡
    idea中一份代码模拟集群
    Eureka集群
    Eureka配置服务提供者、服务消费者、失效剔除和自我保护
  • 原文地址:https://www.cnblogs.com/shenben/p/5777181.html
Copyright © 2011-2022 走看看