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