UVA 11100 The Trip, 2007 水题一枚

系统 1736 0

题目链接: UVA - 11100

题意描述:n个旅行箱,形状相同,尺寸不同,尺寸小的可以放在尺寸大的旅行箱里。现在要求露在最外面的旅行箱的数量最少的同时满足一个旅行箱里放的旅行箱的数量最少。求出这样满足要求的任意一种方案。

算法分析:首先我们可以确定最少的旅行箱的数量cnt:即n个旅行箱里按照尺寸大小分类(尺寸相同的在同一类),数量最多的那一类的数量。然后把cnt看成有cnt个堆,第二个要求就是要让这cnt个堆里最大旅行箱数量最小,直接用vector处理即可。

等AC之后突然想到,三个旅行箱尺寸大小为2,2,4,那么就可以把前两个放在最后一个呀,但答案不是这样的。-_-

      
         1
      
       #include<iostream>


      
         2
      
       #include<cstdio>


      
         3
      
       #include<cstring>


      
         4
      
       #include<cstdlib>


      
         5
      
       #include<cmath>


      
         6
      
       #include<algorithm>


      
         7
      
       #include<vector>


      
         8
      
      
        #define
      
       inf 0x7fffffff


      
         9
      
      
        using
      
      
        namespace
      
      
         std;


      
      
        10
      
      
        const
      
      
        int
      
       maxn=
      
        10000
      
      +
      
        10
      
      
        ;


      
      
        11
      
      
        const
      
      
        int
      
       M = 
      
        1000000
      
      +
      
        10
      
      
        ;


      
      
        12
      
      
        13
      
      
        int
      
      
         n,an[maxn];


      
      
        14
      
      
        int
      
      
         vis[M],num[maxn];


      
      
        15
      
       vector<
      
        int
      
      >
      
         vec[maxn];


      
      
        16
      
      
        17
      
      
        int
      
      
         main()


      
      
        18
      
      
        {


      
      
        19
      
      
        int
      
       ok=
      
        0
      
      
        ;


      
      
        20
      
      
        while
      
       (scanf(
      
        "
      
      
        %d
      
      
        "
      
      ,&n)!=EOF &&
      
         n)


      
      
        21
      
      
            {


      
      
        22
      
      
        if
      
       (ok) printf(
      
        "
      
      
        \n
      
      
        "
      
      
        );


      
      
        23
      
               ok=
      
        1
      
      
        ;


      
      
        24
      
               memset(vis,
      
        0
      
      ,
      
        sizeof
      
      
        (vis));


      
      
        25
      
      
        for
      
       (
      
        int
      
       i=
      
        0
      
       ;i<maxn ;i++
      
        ) vec[i].clear();


      
      
        26
      
      
        int
      
       cnt=
      
        0
      
      ,maxSize=
      
        0
      
      
        ;


      
      
        27
      
      
        for
      
       (
      
        int
      
       i=
      
        1
      
       ;i<=n ;i++
      
        )


      
      
        28
      
      
                {


      
      
        29
      
                   scanf(
      
        "
      
      
        %d
      
      
        "
      
      ,&
      
        an[i]);


      
      
        30
      
                   vis[an[i] ]++
      
        ;


      
      
        31
      
                   cnt=
      
        max(cnt,vis[an[i] ]);


      
      
        32
      
                   maxSize=
      
        max(maxSize,an[i]);


      
      
        33
      
      
                }


      
      
        34
      
               sort(an+
      
        1
      
      ,an+n+
      
        1
      
      
        );


      
      
        35
      
      
        int
      
       c=
      
        0
      
      
        ;


      
      
        36
      
      
        for
      
       (
      
        int
      
       i=
      
        1
      
       ;i<=n ;i++
      
        )


      
      
        37
      
      
                {


      
      
        38
      
      
                    vec[c].push_back(an[i]);


      
      
        39
      
                   c=(c+
      
        1
      
      )%
      
        cnt;


      
      
        40
      
      
                }


      
      
        41
      
               printf(
      
        "
      
      
        %d\n
      
      
        "
      
      
        ,cnt);


      
      
        42
      
      
        for
      
       (
      
        int
      
       i=
      
        0
      
       ;i<cnt ;i++
      
        )


      
      
        43
      
      
                {


      
      
        44
      
      
        int
      
       k=
      
        vec[i].size();


      
      
        45
      
                   printf(
      
        "
      
      
        %d
      
      
        "
      
      ,vec[i][
      
        0
      
      
        ]);


      
      
        46
      
      
        for
      
       (
      
        int
      
       j=
      
        1
      
       ;j<k ;j++) printf(
      
        "
      
      
         %d
      
      
        "
      
      
        ,vec[i][j]);


      
      
        47
      
                   printf(
      
        "
      
      
        \n
      
      
        "
      
      
        );


      
      
        48
      
      
                }


      
      
        49
      
      
            }


      
      
        50
      
      
        return
      
      
        0
      
      
        ;


      
      
        51
      
       }
    

 

UVA 11100 The Trip, 2007 水题一枚


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论