程序员

搜狐2017笔试题:包裹运输

2018-08-20  本文已影响12人  Switchhh

审题要清晰,很多人没有看到“高度相同”当成了立方体,结果做起来就更加复杂了。
设从大到小对应需要包装盒的数量分别为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>
上一篇 下一篇

猜你喜欢

热点阅读