题目描述
一个工厂生产的产品形状都是长方体,高度都是h,主要有1 * 1,2 * 2,3 * 3,4 * 4,5 * 5,6 * 6等6种。这些产品在邮寄时被包装在一个6 * 6 * h的长方体包裹中。由于邮费很贵,工厂希望减小每个订单的包裹数量以增加他们的利润。因此他们需要一个好的程序帮他们解决这个问题。你的任务就是设计这个程序。
输入
输入包括多组测试数据,每一行代表一个订单。每个订单里的一行包括六个整数,用空格隔开,从小到大分别为这6种产品的数量。6个0表示文件结束。
输出
针对每个订单输出一个整数,占一行,代表对应的订单所需的最小包裹数。没有多余的空行。
样例输入 复制
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
样例输出 复制
2
1
这个题的思路就是从大到小一个一个算 给2和1留出空位
#include <iostream>
using namespace std;
void _3007_()
{
int a, b, c, d, e, f;
while (1)
{
int h = 0;
scanf("%d%d%d%d%d%d", &a, &b, &c, &d, &e, &f);
if (a + b + c + d + e + f == 0)break;
//对f
h += f;
//对e
h += e;
int leftfortwo = 5 * e;
int leftforone = e;
//对d
h += d;
leftfortwo += 10 * d;
//对c
h += (c + 3) / 4;
if (c % 4 == 1)
{
leftfortwo += 13 * ((c + 3) / 4);
leftforone += (c + 3) / 4;
}
else if (c % 4 == 2)
leftforone += 9 * ((c + 3) / 4);
else if (c % 4 == 3)
{
leftfortwo += 4 * ((c + 3) / 4);
leftforone += ((c + 3) / 4);
}
//对b
if (b <= leftfortwo)
{
leftforone += (leftfortwo - b) * 2;
}
else
{
h += (b - leftfortwo) / 18 + 1;
}
//对a
if (a > leftforone)
{
h += (a - leftforone) / 36 + 1;
}
cout << h << endl;
}
}
int main()
{
_3007_();
return 0;
}