POJ1017-Packets

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值