1226:装箱问题

 这个人的代码太厉害了,尤其是向上取整。


思路:


一、首先装6×6的,每个6×6的装一个箱子刚好。
二、然后装5×5的,每个5×5的需要一个箱子,箱子里多余的空间装1×1的,可以每个箱子装11个。
三、然后装4×4的,每个4×4的需要一个箱子。箱子里多余的空间可以装2×2,也可以装1×1。先装2×2,每个箱子最后可以装5个2×2,当2×2不够时,再考虑装1×1的。每个箱子最多装20个1×1。
四、然后装3×3的。每个箱子可以装4个3×3的。剩下的3×3又分3种情形:
1)剩1个3×3,要装一个箱子,剩余27格空间。最多可以装5个2×2和7个1×1;
2)剩2个3×3,要装一个箱子,剩余18格空间。最多可以装3个2×2和6个1×1;
3)剩3个3×3,要装一个箱子,剩余9格空间,最多可以装1个2×2和5个1×1;
然后装2×2的,每个箱子可以装9个2×2的。剩下的用1×1的装。
最后考虑装1×1的,每个箱子可以装36个1×1,如果还有多余的,则增加一个箱子装。

一&四

代码: 

#include<cstdio>
#include<iostream>
using namespace std;
int a,b,c,d,e,f,g,h;
int n;
//g 1*1空位数 
//h 2*2空位数
int k[4]={0,5,3,1};//3*3四种情况图 ,2*2的个数 
//表示3*3的产品为3*3产品打开的新箱子中剩余2*2的空位数   
 //即剩余2*2的空位数 0,1,2,3种情况 
 int main(){
 
 while(scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f)!=EOF){
 	if(a==0 && b==0 && c==0 && d==0 && e==0 && f==0) 
 	break;
 	n = f + e + d + (c+3)/4;//6*6和5*5和4*4一定是一个占一个箱子,而3*3 4个占一个箱子
 	h = 5 * d +k[c%4];//长宽大于或等于3*3的产品所占的新箱子数目
 	if(b > h)//2*2的个数比我们留出来为2*2的空间个数多,就需要为2*2另开箱子 
 	 n += (b-h + 8)/9;//多出来的2*2箱子应该占用的新箱子数 ,求出多需要几个2*2空间,+8是向上取整,再除以9,(因为每个箱子可以放9个2*2) 
 	 g = 36 * n -36 * f -25 * e -16 * d - 9 * c -4 * b;//全部1*1箱子 ,用减法计算1*1剩余的空间 
	  if(a > g)//如果1*1的个数,比我们留出的空间多就需要另开空间 
	  n += (a-g + 35)/36; ;//+35是向上取整,将多出来的另开箱子 
	  printf("%d\n",n);
 } 
 return 0;
}

 代码中疑惑的解答:

1.     (c+3)/4。

n = f + e + d + (c+3)/4;//6*6和5*5和4*4一定是一个占一个箱子,而3*3 4个占一个箱子

一开始知道它是向上取整,但是不知道为什么让c+3而不是其他数。其实很简单,c=5的时候要让结果等于2、c=6的时候要让结果等于2……我们可以发现,因为余数最小是1,余1的时候要多一个箱子,所以是+3;同理,如果除5的时候就是加4.

————————————————
版权声明:本文为CSDN博主「zqhf123」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zqhf123/article/details/104254143

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值