美文网首页程序员
搜狐2017笔试题:包裹运输

搜狐2017笔试题:包裹运输

作者: Switchhh | 来源:发表于2018-08-20 11:13 被阅读12次

    审题要清晰,很多人没有看到“高度相同”当成了立方体,结果做起来就更加复杂了。
    设从大到小对应需要包装盒的数量分别为n6、n5、n4、n3、n2、n1,总数ans。

    6 * 6直接加到总数里
    5 * 5可以用11个1 * 1填充
    

    每有一个n5就需要n1 – 11,如果n1减为负数,不需要理会,所以剩余的n1数量为n1 – 11 * n5。

    4 * 4可以用5个2 * 2填充
    

    每有一个n4优先用2*2填充那么剩余的n2数量为n2 – 5 * n4
    这里需要关注一下n2的值,这里即便n2减成负的了也不影响计算,用n1填充n2的负值(就是把n2没填满的部分用n1填上)

    3 * 3的比较复杂四个为一组,多出来的需要进行填充
    

    下面是凑不成四个一组的四种情况,判断一下然后根据条件执行:

    3个3 * 3
    需要1个2 * 2 + 5个1*1填充
    
    2个3 * 3
    需要3个2 * 2 + 6个1*1填充
    
    1个3 * 3
    需要5个2 * 2 + 7个1 * 1填充
    
    0个3 * 3
    

    最后是2 * 2和1 * 1盒子

    2 * 2
    1 * 1
    

    根据条件可以将n2和n1合并计算n1 + 4 * n2,填满6 * 6的36个位置,代码如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>包裹运输</title>
    </head>
    <body>
        <textarea id="inp"></textarea>
        <button id="btn" onclick="print()">提交</button>
        <script type="text/javascript">
            function print(){
                var all = document.getElementById('inp').value;
                var lines = all.split("\n");
                for(var i=0;i<lines.length;i++){
                    var str = lines[i].split(" ");
                    var n1 = parseInt(str[0]);
                    var n2 = parseInt(str[1]);
                    var n3 = parseInt(str[2]);
                    var n4 = parseInt(str[3]);
                    var n5 = parseInt(str[4]);
                    var n6 = parseInt(str[5]);
                    var ans = 0;
                    ans = (n6 + n5 + n4 + parseInt(n3/4));//算出6*6 5*5 4*4 3*3所占的盒子数量
                    n1 = n1 - (11 * n5);     //填补5*5后剩余的1*1数量
                    n2 = n2 - (5 * n4);      //填补4*4后剩余的2*2数量,可以为负,负即被1*1填补
                    if(n3%4){
                        ans++;   //根据四个一组外多余数量的3*3盒子进行填充
                        switch(n3%4)
                        {
                        case 1:
                          n2 = n2 - 5;
                          n1 = n1 - 7;
                          break;
                        case 2:
                          n2 = n2 - 3;
                          n1 = n1 - 6;
                          break;
                        case 2:
                          n2 = n2 - 1;
                          n1 = n1 - 5;
                          break;
                        }
                    }
                    if(n1 < 0){
                        n1 = 0;
                    }
                    if( n1 + 4*n2 > 0 ){
                        //如果所有都填补完还剩余1*1 2*2盒子,则计算2*2 1*1所需的包装盒
                        ans += (parseInt((n1 + 4*n2)/36)+1);
                    }
                    console.log(ans);
                }
            }
        </script>
    </body>
    </html>
    

    相关文章

      网友评论

        本文标题:搜狐2017笔试题:包裹运输

        本文链接:https://www.haomeiwen.com/subject/efpkiftx.html