标签:
==========================================================================================================
思路:
6*6 的产品每个会占用一个完整的箱 子,并且没有空余空间;
5*5 的产品每个占用一个新的箱子,并且留下 11 个可以盛放 1*1 的产品的空余空间;
4*4 的产品每个占用一个新的箱子,并且留下 5 个可以盛放 2*2 的产品 的空余空间;
3*3 的产品情况比较复杂,首先 3*3 的产品不能放在原来盛有 5*5 或者 4*4 的
箱子中,那么必须为 3*3 的产品另开新的箱子,新开的箱子数目等于 3*3 的产品的数目除以 4 向上取整;同时我们需要讨论为 3*3 的产品新开箱子时,
剩余的空间可以盛放多少 2*2 和 1*1 的产品(这里如果有空间可以盛放 2*2 的产品,我们就将它计入 2*2 的空余空间,等到 2*2 的产品全部装完,如果还有 2*2 的空间剩余,再将它们转换成 1*1 的剩余空间)。
我们 可以分情况讨论为 3*3 的产品打开的新箱子中剩余的空位,共为四种情况:
第一种,3*3 的 产品的数目正好是 4 的倍数,所以没有空余空间;
第二种,3*3 的产品数目是 4 的倍数加 1, 这时还剩 5 个 2*2 的空位和 7 个 1*1 的空位;
第三种,3*3 的产品数目是 4 的倍数加 2,这 时还剩 3 个 2*2 的空位和 6 个 1*1 的空位;
第四种,3*3 的产品数目是 4 的倍数加 3,这时 还剩 1 个 2*2 的空位和 5 个 1*1 的空位;
数组u[4]={0, 5, 3, 1}代表这四种情况下的剩余空间2*2的个数
==========================================================================================================
源码:
#include <stdio.h>
void 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(true)
{ // 1*1 2*2 3*3 4*4 5*5 6*6
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];
if(b > y)
//向上取整
N += (b - y + 8 ) / 9;
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);
}
}//代码非原创
标签:
原文地址:http://www.cnblogs.com/superkrissV/p/4448793.html