C语言OJ题——1091装箱问题

2024-02-21 09:52
文章标签 语言 问题 oj 装箱 1091

本文主要是介绍C语言OJ题——1091装箱问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

装箱问题

  • 1.题目
  • 2.解题思路
  • 3.代码实现
  • 4.细节补充说明

1.题目

题目描述
一个工厂生产的产品形状都是长方体,高度都是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)6 * 6:毫无疑问,6 * 6的产品每个都会占用一整个箱子,因此有多少个6 * 6的产品,必须有多少个箱子,而且没有任何空余的空间存放其他产品。
(2)5 * 5:该产品也必须自己占用一个箱子,但是会有剩余,剩余的部分为6 * 6 - 5 * 5=11,这11个空间很显然只能存放1 * 1大小的产品,因此,5 * 5的可以和1 * 1放在一起,可以放11个11的产品。
(3)4 * 4:该产品也需要自己占用一个箱子,剩余的空间既可以放2 * 2的产品,能放5个,也可以全部放1 * 1的产品,能放20个。
(4)3 * 3:该产品也需要自己占用一个箱子,但是由于是6的一半,也就是说4个3 * 3的产品正好可以装满一个整箱子,因此我们可以根据3 * 3的产品数来对4求余,如果余数为0,说明正好是4的倍数,直接除以4就是所需的箱子数,不再有剩余空间。如果余数不为0,那么则是除以4取整后再加1。这时候就会出现剩余空间,这要分三种情况来考虑,一是余数为1,也即1个箱子里只放1个3 * 3的产品,那么剩余的空间为27,最多可以放5个2 * 2的空间和7个1 * 1的空间(或者全放1
1则可以放27个),同样,余数为2的话,则剩余的空间为18,最多可以放3个2 * 2和6个1 * 1(或者18个1 * 1),最后一种就是余数为3,则剩余空间为9,最多只能放1个2 * 2和5个1 * 1(或者9个1 * 1)。
(5)2 * 2:该产品可以和44或33产品放一起,因此我们可以先把44和33产品剩余下来的22空位全部占满,如果不够,则需要重新占用新箱子,很显然9个2 * 2产品正好占满一个箱子,所需新箱子的数量应该对9求余,余数为0,则直接整除9即可,否则整除9后再加1。
(6)1 * 1:该产品最简单了,可以先把所有剩余的1
1空间占满,如果不够,则重新占用新箱子,很显然一个6 * 6的箱子可以存放36个1 * 1,因此剩余的1*1产品数对36求余,余数为0,直接整除36,否则整除36加1。
最后把这6种情况各自所需的箱子数累加起来就是题目所要的结果。

3.代码实现

#include <stdio.h>
int main()
{int p[7];//p[1] - p[6]分别表示1*1,2*2,...,6*6的个数,p[0]不用管,创建7个元素只是为了对应标记方便int pack3_2[4] = {0,5,3,1},pack3_1[4] = {0,7,6,5};//pack3_2[i]表示装i个3*3时可以装2*2的个数(i>0)//也就是混装的情形while(1){int sum = 0;scanf("%d%d%d%d%d%d",&p[1],&p[2],&p[3],&p[4],&p[5],&p[6]);if(p[1] == 0 && p[2] == 0 && p[3] == 0 && p[4] == 0 && p[5] == 0 && p[6] == 0 )break;//装6*6sum += p[6];//装5*5sum += p[5];p[1] = p[1] - 11*p[5];//装4*4sum += p[4];p[2] = p[2] - 5*p[4];//优先装2*2的,所以这里不再写p[1] = p[1] - 20*p[1] —————————— (1)//装3*3sum += (p[3] + 3) / 4;p[3] = p[3] % 4;if(p[3] > 0)//剩下3*3的货物为1个或2个或3个{p[2] = p[2] - pack3_2[p[3]];p[1] = p[1] - pack3_1[p[3]];}//开始装2*2if(p[2] < 0)//说明原有的箱子够装2*2了{p[1] = p[1] + 4*p[2];//此时把原来计划用于装2*2的用来装1*1,比如2*2的箱子只有1个,(1)式中p[2] ==//-4,说明那4个原本用于装2*2的此时要装1*1}//到这里装5*5,4*4,3*3的箱子已经完全被填满,需要额外的箱子装1*1和2*2if(p[2] > 0) //还剩下2*2的{sum += (p[2] + 8) / 9;p[2] = p[2] % 9;p[1] = p[1] - (36 - p[2]*4);//这一步容易错,我就是在这里写错!!}//1*1if(p[1] > 0){sum += (p[1] + 35) /36;}printf("%d\n",sum);}return 0;
}

4.细节补充说明

在这里插入图片描述

这篇关于C语言OJ题——1091装箱问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/731376

相关文章

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

Java中字符编码问题的解决方法详解

《Java中字符编码问题的解决方法详解》在日常Java开发中,字符编码问题是一个非常常见却又特别容易踩坑的地方,这篇文章就带你一步一步看清楚字符编码的来龙去脉,并结合可运行的代码,看看如何在Java项... 目录前言背景:为什么会出现编码问题常见场景分析控制台输出乱码文件读写乱码数据库存取乱码解决方案统一使

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec