poj 1017 Packets

poj 1017 http://poj.org/problem?id=1017

原本bug超多的代码尴尬

#include<stdio.h>
int  main()
{
    int a[7];
    while(scanf("%d %d %d %d %d %d",&a[1],&a[2],&a[3],&a[4] ,&a[5],&a[6]) &&(a[1]+a[2]+a[3]+a[4]+a[5]+a[6] != 0))
    {
        int s = 0,k = 0, t = 0;
        /*if(a[2]>=9)
		{
			s = a[2]/9;		a[2] = a[2] - 9*(a[2]/9);
		}*/
        if(a[5] != 0)
        {
            if(a[1] > 11*a[5])
                a[1] = a[1] - 11*a[5];
            else
                a[1] = 0;
			//printf("一:a[1] = %d,a[2] = %d
",a[1],a[2]);
        }
        if(a[4] != 0)
        {
            if(a[2] > 5*a[4])
                a[2] = a[2] - 5*a[4];
            else
                {

                    if((20*a[4] - 4*a[2]) < a[1])
                        a[1]  = a[1] - (20*a[4] - 4*a[2]);
                    else
                        a[1] = 0;
					a[2] = 0;
                }
			//printf("二:a[1] = %d,a[2] = %d
",a[1],a[2]);
        }
		if(a[3] != 0)
        {
            if((a[3] % 4) != 0)
            {
                k = 7 - 2 * (a[3] % 4);
                if(a[2] > k)
                {
                    a[2] = a[2] - k;
                    t = 36 - 9*(a[3] % 4) - 4*k;
                    if(t < a[1]) a[1] = a[1] - t;
                    else         a[1] = 0;

                }
                else
				{
					if(a[1] > ((36-9*(a[3]%4))-4*a[2])) a[1] = a[1] - ((36-9*(a[3]%4))-4*a[2]);
					else         a[1] = 0;
					a[2] = 0;
				}
			}
			//printf("三:a[1] = %d,a[2] = %d
",a[1],a[2]);
        }
        if(a[2] != 0)
		{
			//a[2] = a[2]%9;
			a[1] -= 36 - (a[2]%9)*4;
		}
       // printf("四:a[1] = %d,a[2] = %d
",a[1],a[2]);
        /*for(int i=1;i<7;i++) printf("a[%d] = %d	",i,a[i]);
        printf("
");*/
        s = a[6] + a[5] + a[4] +(a[3] + 3)/4 + (a[2]+8)/9 + (a[1] + 35)/36;
        printf("%d
",s);
    }
}


附上别人的代码

http://blog.csdn.net/dongfengkuayue/article/details/6461374

#include <stdio.h>
int main()
{
	int N, a, b, c, d, e, f, y, x;//N用来存储需要的箱子数目,y用来存储 2*2 的空位数目
	// x 用来存储 1*1 的空位数目。
	int u[4] = {0, 5, 3, 1};
   //数组u 表示3*3 的产品数目分别是 4的倍数,4 的倍数+1, 4 的倍数+2, 4 的倍数+3
   //时,为3*3的产品打开的新箱子中剩余的 2*2的空位的个数

	while (1)
	{
		scanf("%d%d%d%d%d%d", &a, &b, &c, &d, &e, &f);

		if (a == 0 && b == 0 && c == 0 && d == 0 && e == 0 && f == 0)
		{
			break;
		}

		N = f + e + d + (c + 3) / 4;
	    //这里有一个小技巧 - (c+3)/4  正好等于 c 除以4向上取整的结果,下同
		y = 5 * d + u[c % 4];//每一个4*4的箱子装过后还可以再装5个2*2的箱子

		//还有3*3的箱子如果没填满6*6的箱子的话,也可以用来装2*2的箱子
		//5*5的箱子则只能装1*1的情况了
		if (b > y)
		{
			N += (b - y + 8) / 9;    //如果要装的2*2的箱子的数目比提供的空间要多,
		}

		//那么多的部分要新开一些箱子
		x = 36 * N - 36 * f - 25 * e - 16 * d - 9 * c - 4 * b;

		if (a > x)
		{
			N += (a - x + 35) / 36;
		}

		printf("%d
", N);
	}
}


www.cnblogs.com/tenlee
原文地址:https://www.cnblogs.com/tenlee/p/4420162.html