您的位置:首页 > 其它

poj1017 模拟

2016-02-21 22:39 344 查看
题意:一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为 1*1, 2*2, 3*3, 4*4, 5*5, 6*6.  这些产品通常使用一个6*6*h的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。 

输入:输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空 格隔开,分别为 1*1 至6*6 这六种产品的数量。输入文件将以 6个0组成的一行结尾。   

输出:最少包裹数

难度:*

算法:模拟 

1.对f个6*6的产品,需要f个箱子

2.对e个5*5的产品,需要e个箱子,另外还能放11个1*1的产品 

3.对d个4*4的产品,需要d个箱子,另外还能放5个2*2的产品 

4.对c个3*3的产品,需要ceil(c/3.0)个箱子,另外,

  如果 c%3 == 0,箱子完全使用,无剩余

  如果 c%3 == 1,箱子还能放5个2*2的产品

  如果 c%3 == 2,箱子还能放3个2*2的产品

  如果 c%3 == 3,箱子还能放1个2*2的产品

5.对b个2*2的箱子,由3和4可算出能可存放的个数,如果不能完全放下,再计算还需要多少个新的箱子

6.对a个1*1的箱子,使用面积法:总面积为36*n(n为前5步算出的箱子数),已用面积为36*f+25*e+16*d+9*c+4*b,
  用总的面积减去已用面积,可知已用的箱子中还能存放多少个1*1的产品,如果不能完全放下,再计算还需要多少个新的箱子。 

#include<iostream>
#include <math.h>
using namespace std;

int main()
{
int a,b,c,d,e,f;
int m[4] = {0,5,3,1};
while (cin >> a >> b >> c >> d >> e >> f)
{
if (a+b+c+d+e+f == 0)
{
break;
}
int n = 0;
n += f;			// 6*6
n += e;			// 5*5
n += d;			// 4*4
n += ceil(double(c/4.0));	// 3*3
int x = d*5 + m[c%4];		// 已选用箱子剩余2*2位置的个数
if (b > x) 		// 2*2
{
n += ceil(double(b-x)/9.0);					// 还需要多少个新箱子盛放2*2的产品
}
int y = 36*n - 36*f - 25*e - 16*d - 9*c - 4*b;	// 已选用箱子剩余1*1的个数
if (a > y)
{
n += ceil(double(a-y)/36.0);				// 还需要多少个新箱子盛放1*1的产品
}
cout << n << endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj