Packets
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 60023 | Accepted: 20357 |
Description
A factory produces products packed in square packets of the same height h and of the sizes 1*1, 2*2, 3*3, 4*4, 5*5, 6*6. These products are always delivered to customers in the square parcels of the same height h as the products have and of the size 6*6. Because of the expenses it is the interest of the factory as well as of the customer to minimize the number of parcels necessary to deliver the ordered products from the factory to the customer. A good program solving the problem of finding the minimal number of parcels necessary to deliver the given products according to an order would save a lot of money. You are asked to make such a program.
Input
The input file consists of several lines specifying orders. Each line specifies one order. Orders are described by six integers separated by one space representing successively the number of packets of individual size from the smallest size 1*1 to the biggest size 6*6. The end of the input file is indicated by the line containing six zeros.
Output
The output file contains one line for each line in the input file. This line contains the minimal number of parcels into which the order from the corresponding line of the input file can be packed. There is no line in the output file corresponding to the last ``null'' line of the input file.
一、题意
有若干1*1,2*2,3*3,4*4,5*5,6*6大小的货物,要求包装在6*6的箱子中。问最少需要几个箱子。
二、思路
4*4,5*5,6*6大小的货物,每个至少需要一个箱子。然后计算3*3需要的箱子。再计算剩余的空格可以装多少2*2的货物,从而算出2*2需要多少额外的箱子。最后算出空余位置可以装多少1*1的货物,求出总的箱子数。
三、代码
#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <numeric>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <utility>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
const int MAXN = 10;
const int MOD7 = 1000000007;
const int MOD9 = 1000000009;
const int INF = 2000000000;//0x7fffffff
const double EPS = 1e-9;
const double PI = 3.14159265358979;
const int dir_4r[] = { -1, 1, 0, 0 };
const int dir_4c[] = { 0, 0, -1, 1 };
const int dir_8r[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
const int dir_8c[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
int input[MAXN];
int leftt[] = { 0, 5, 3, 1 };//leftt[i]表示填入i个3*3后剩余空位可装入2*2的数量
int main() {
while (true) {
int sum = 0;
for (int i = 1; i <= 6; ++i) {
scanf("%d", input + i);
sum += input[i];
}
if (!sum)
break;
int ans;
int x, y, z;//剩余的1*1,2*2,3*3的空格数
ans = input[6] + input[5] + input[4];//6*6, 5*5, 4*4大小的至少需要一个盒子
ans += ceil(input[3] / 4.0);//四个3*3可以装一箱
y = 5 * input[4] + leftt[input[3] % 4];//剩余2*2的个数
if (y < input[2])
ans += ceil((input[2] - y) / 9.0);//九个2*2可以装一箱
x = 36 * ans - 36 * input[6] - 25 * input[5] - 16 * input[4] - 9 * input[3] - 4 * input[2];
if (x < input[1])
ans += ceil((input[1] - x) / 36.0);
printf("%d\n", ans);
}
//system("pause");
return 0;
}