算法刷题:模拟法0202-Packets

前言

hello,大家好,今天这期文章将分享一道有意思的题目,让我们来看看吧。

1. 题目描述

一家工厂生产的产品,被包装在正方形包装盒中,产品具有相同的高度h。大小规格为11、22、33、44、55和66.这些产品用高度为h,大小规格为6*6的正方形邮包交给顾客,因为费用问题,工厂和顾客都需要将订购的物品从工厂发给客户的邮包数量最小化,请编写一个程序,对于按照订单发送的给定产品,求出最少的邮包数量,以节省费用。
输入
输人由若干行组成,每行描述一份订单, 每份订单由6个整数组成,整数之间用一- 个空格分开,连续的整数表示从最小的1x1到最大的6X6每种大小的包装盒的数量,输人以包含6个0的一行结束。
输出
对每行输人,输出一行,给出邮包的最小数量。对于输人的最后一行“空输人”没有输出。
在这里插入图片描述

2. 题目分析

这是一道构造法模拟题,数学模型是贪心策略。按照尺寸递减顺序装入包装盒。由于邮包尺寸为66,则44、55、66的包装盒需要单独一个邮包。
对于66的邮包,每一个里面只可以装入一个66。
一个55的包装盒可以和11放进一个。
44可以和一个22或11放进一个。
3
3一个包装盒里可以放进4个。
22和11的包装盒同样处理。
设ii的包装盒数为ai(1<=i<=6)放入33、44、55、66则至少需要的邮包数M=a6+a5+a4+a3/4。
M个邮包可以放入2
2的包装盒数量L2=a45+u[a3%4],u0=0,u[1]=5,u[2]=3,u[3]=1。如果还有剩余的22包装盒(a2>L2)则放入新增的(a2-L2)/9个邮包即M+=(a2-L2)/9。
最后将11的邮包放入上述M个邮包,可以填装11的包装盒的数量L1=m36-a636-a525-a416-a39-a24.如果还有剩余的1*1(a1>L1)则需要新增(a1-L1)/36个邮包。即M+=(a1-L1)/36。
即M是放入邮包的最小数。

3. 代码实现

#include<iostream>
using namespace std;

int main()
{
	int a[10], i, sum, m, left1, left2;
	int u[4] = { 0, 5, 3, 1 };
	while (1)
	{
		sum = 0;
		for (int i = 1; i <= 6; i++)
		{
			cin >> a[i];
			sum += a[i];
		}
		if (sum == 0)
			break;
		m = a[6] + a[5] + a[4] + (3+a[3]) / 4;
		left2 = a[4] * 5 + u[a[3] % 4];
		if (a[2] > left2)
			m += (a[2] - left2 + 8) / 9;
		left1 = m * 36 - a[6] * 36 - a[5] * 25 - a[4] * 16 - a[3] * 3 - a[2] * 4;
		if (a[1] > left1)
			m += (a[1] - left1 + 35) / 36;
		cout << m << endl;
	}
	return 0;
}

在这里插入图片描述
这是一道很有趣的题,几个小细节很有意思。首先,能不能装进去我们看的是面积哦,不要想当然哦。
在这里插入图片描述

我们在计算的时候,会发现有类似于a3这种的要加一个比除数小1的数,这是因为我们要确保盒子够用。

后记

好的,这篇文章就分享到这里啦,下期再见。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lxkeepcoding

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

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

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

打赏作者

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

抵扣说明:

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

余额充值