poj 1017 http://poj.org/problem?id=1017
#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\n",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\n",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\n",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\n",a[1],a[2]);
/*for(int i=1;i<7;i++) printf("a[%d] = %d\t",i,a[i]);
printf("\n");*/
s = a[6] + a[5] + a[4] +(a[3] + 3)/4 + (a[2]+8)/9 + (a[1] + 35)/36;
printf("%d\n",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", N);
}
}