题目描述
一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个
型号,他们的长宽分别为1*1, 2*2, 3*3, 4*4, 5*5, 6*6. 这些产品通常使用一个 6*6*h 的长方
体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的
包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由
你来设计。
输入数据
输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空
格隔开,分别为1*1 至6*6 这六种产品的数量。输入文件将以6 个0 组成的一行结尾。
输出要求
除了输入的最后一行6 个0 以外,输入文件里每一行对应着输出文件的一行,每一行输
出一个整数代表对应的订单所需的最小包裹数。
输入样例
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
输出样例
2
1
思路:当有几个6*6,5*5,4*4木块的时候箱子的数量就是几,当时6*6木块的时候一点空间也不留,当5*5的时候还留下十一个1*1的位置可以填,当是4*4的时候还有五个2*2的位置可以填,当遇到3*3的时候开始分类讨论,因为3*3不能填到上面三个中的缝隙:
1、当3*3的箱子的数量是4的倍数的时候,就把箱子的数量加上3*3箱子的数量对四取模,
2、当是4的倍数+1的时候,箱子的数量加上3*3的木块除4向上取整,还剩下5个2*2的位置和11个1*1的位置
3、当是4的倍数+2的时候,箱子的数量加上3*3的木块除4向上取整,还剩下三个2*2的位置还有6个1*1的位置
4、当是4的倍数+3的时候,箱子的数量加上3*3的木块除四向上取整,还剩下一个2*2的位置还有5个1*1的位置
求出用完上面四种木块的剩下的2*2的位置还有1*1的位置,
首先用2*2开始填充,填充完了再全部用1*1的木块填充
代码如下:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main() { int a,b,c,d,e,f; //分别表示六中木块 int ans = 0; //需要的箱子数 int x,y; //x表示用完四个大的木块剩下 2*2的位置 y表示剩下的1*1的位置 int three[4] = {0,5,3,1}; //3*3的个数除4剩下的有多少2*2的剩余位置 while(~scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f)) { if(!a&&!b&&!c&&!d&&!e&&!f) break; ans = f+e+d+(c+3)/4; y = d*5+ three[c%4]; if(b>y) ans += (b-y+8)/9; x = 36*ans-36*f-25*e-16*d-9*c-b*4; if(a>x) ans += (a-x+35)/36; printf("%d\n",ans); } return 0; }