poj1017 packets

题目描述

一个工厂制造的产品形状都是长方体,它们的高度都是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;
}


你可能感兴趣的:(poj1017 packets)