poj1017 模拟

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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kangwq2017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值