【做题笔记】[NOIOJ,非NOIp原题]装箱问题
题意:给定一些矩形,面积分别是 \(1\times 1,2\times 2,3\times 3,4\times 4,5\times 5,6\times 6\)。您现在知道了这些矩形的个数 \(a,b,c,d,e,f\),需要将这些矩形一个不落的装到一种面积为 \(6\times 6\)的大矩形里面,问如何使大矩形的数量最少(输入包含多组数据,以全部都是 0 结尾)。
样例输入:
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
样例输出:
2
1
分组考虑,首先,我们知道对于 \(6\times 6,5\times 5,4\times 4\)的矩形一个大矩形中只能占一个。如图

于是设每次答案为 \(\text{ans}\),则答案最少为 \(\text{ans+d+e+f}\)。
顺着刚刚的思路,单独考虑对于 \(3\times 3\)的情况。不难发现,一个大矩形最多可以接纳 4 个 \(3\times 3\) 的矩形,换而言之,4 个这样的小矩形占用一个大矩形。考虑到余数,则答案需再加上 \((c+3)/4\)。(补 3 除 4,在本题中这是一个很重要的思路)。
于是当前答案有:int ans=(d+e+f+(c+3)/4);
接着,考虑面积为 \(2\times 2\) 的矩形的情况。注意到被蓝色和红色区域“占领”的面积都无法接纳 \(2\times 2\)的矩形,那么考虑已经装入 \(4\times 4\) 和 \(3\times 3\) 的。 \(4\times 4\)的比较好想,显而易见的最多只能填入 5 个。对于 \(3\times 3\) 的矩形,分别考虑装入一个 \(3\times 3\),两个 \(3\times 3\) 和三个 \(3\times 3\) 的情况。思考可以发现对应的答案分别为 \(5,3,1\) 。由于 \(3\times 3\) 的数量不确定,可以开一个数组记录,即 int mod[4]={0,5,3,1};,然后设变量 \(y\) 为当前答案下最多能装入的 \(2\times 2\) 的数量,把这个值与输入的 \(2\times 2\) 的数量作比较,若比输入的数量少,则说明剩下的此类型的矩形只有单独放。根据“补 3 除 4”的原则易得还需加上的新矩形为 (b-y+8)/9 个。
最后,考虑 \(1\times 1\) 的矩形。这种矩形很特殊,我们分析发现它的一个性质——它不涉及填入后留空位的问题。啥意思呢?也就是说,我们采用“见缝插针”的方式,即,有多少空就都填满。但是,如果还像上面那样加加除除的话太麻烦了,于是,考虑如下的算法:
首先考虑,对于当前答案的所有面积,若都填一,则能填多少;然后减去其他占用的面积,最后按照如上的方式比较是否需要新增。
以上,就是本题的贪心策略。自证不难
#include <iostream>
#include <cstdio>
using namespace std;
int mod[4]={0,5,3,1};
int main()
{
int a,b,c,d,e,f;
while(1)
{
cin>>a>>b>>c>>d>>e>>f;
if(!a&&!b&&!c&&!d&&!e&&!f)break;
int ans=(d+e+f+(c+3)/4);
int y=5*d+mod[c%4];
if(b>y)ans+=(b-y+8)/9;
int x=36*ans-(36*f+25*e+16*d+9*c+4*b);
if(a>x)ans+=(a-x+35)/36;
cout<<ans<<endl;
}
return 0;
}
/*
data:
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
*/
【做题笔记】[NOIOJ,非NOIp原题]装箱问题的更多相关文章
- NOIP原题 斗地主(20190804)
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关 系根据牌的数码表示如下:3<4&l ...
- NOIP原题板刷
update 10.11 我可能已经刷完大部分了,可是这篇blog我也不想更了 这个人很懒,做了很多题但是不想写题解,也不想更blog,所以这篇blog又咕咕了. 把从 \(1997-2017\) 近 ...
- NOIP2016原题终结测试(2017081801)
NOIP2016还有几道原题没有写掉,今天就一并布置掉. 答案的问题,有部分会先放到NOIP题解中,是单独发布的. 最后会汇总放在答案中,各位不要急. 还有,后期会有原创题测试,这个不急,反正11月才 ...
- C语言程序设计做题笔记之C语言基础知识(下)
C 语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行 事.并且C是相当灵活的,用于执行计算机程序能完成的 ...
- C语言程序设计做题笔记之C语言基础知识(上)
C语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行事.并且C是相当灵活的,用于执行计算机程序能完成的几乎 ...
- LCT做题笔记
最近几天打算认真复习LCT,毕竟以前只会板子.正好也可以学点新的用法,这里就用来写做题笔记吧.这个分类比较混乱,主要看感觉,不一定对: 维护森林的LCT 就是最普通,最一般那种的LCT啦.这类题目往往 ...
- java做题笔记
java做题笔记 1. 初始化过程是这样的: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序 ...
- SAM 做题笔记(各种技巧,持续更新,SA)
SAM 感性瞎扯. 这里是 SAM 做题笔记. 本来是在一篇随笔里面,然后 Latex 太多加载不过来就分成了两篇. 标 * 的是推荐一做的题目. trick 是我总结的技巧. I. P3804 [模 ...
- (各个公司面试原题)在线做了一套CC++综合測试题,也来測一下你的水平吧(二)
刚才把最后的10道题又看了下.也发上来吧. 以下给出试题.和我对题目的一些理解 前10道题地址 (各个公司面试原题)在线做了一套CC++综合測试题.也来測一下你的水平吧(一) 11.设已经有A,B,C ...
随机推荐
- NSSM 将jar 安装成windows服务
1.下载 nssm (下载地址: http://www.nssm.cc/release/nssm-2.24.zip ) 2.将打包好的jar包放到一个文件夹中,编写run.bat文件,run.bat内 ...
- PWA - 整体(未完)
渐进式 Web 应用(PWA) 运用现代的 Web API 以及传统的渐进式增强策略来创建跨平台 Web 应用程序. PWA 的优势 可被发现 易安装 manifest(https://develop ...
- F 采蘑菇的克拉莉丝
这是一道树链剖分的题目: 很容易想到,我们在树剖后,对于操作1,直接单点修改: 对于答案查询,我们直接的时候,我们假设查询的点是3,那么我们在查询的时候可分为两部分: 第一部分:查找出除3这颗子树以外 ...
- TODO:rds数据库实例
rds数据库实例怎么创建的 rds数据库实例高可用是怎么实现的 rds备份是怎么实现的 参考: https://www.cnblogs.com/jackyzzy/p/7384355.html http ...
- keepalived高可用工具
1.准备俩台虚拟机,一台主机,一台备机 我这里模拟的是 主机ip: 192.168.42.66 masternginx 备机ip: 192.168.42.77 slavenginx 虚拟ip: 192 ...
- 修复ThinkPHP导出excel数字过大时显示为科学记数法
修复ThinkPHP导出excel数字过大时显示为科学记数法,这种显示对于查看的用户来说是及其不友好的.所以,我们要使其转化为正常的数字串! 我在google 的过程中,查了一些资料.其中 1).// ...
- C语言-无符号数与有符号数不为人知的秘密
一.无符号数与有符号数 1.计算机中的符号位 数据类型的最高位用于标识数据的符号 -最高位为1,表明这个数为负数 -最高位为0,表明这个数为正数 #include <stdio.h> in ...
- SpringMVC-简单参数绑定
SpringMVC-简单参数绑定 众所周知,springmvc是用来处理页面的一些请求,然后将数据再通过视图返回给用户的,前面的几篇博文中使用的都是静态数据,为了能快速入门springmvc,在 ...
- 题解 P5733 【【深基6.例1】自动修正】
题目传送门 分析: 1.这道题可以说是一个字符串的练习好题.我们先来了解一下字符串.在这道题中,建议使用\(string\) \(string\)是\(C++\).\(java\).\(VB\)等编程 ...
- rm -rf
inux反选删除文件 最简单的方法是 # shopt -s extglob (打开extglob模式) # rm -fr !(file1) 如果是多个要排除的,可以这样: # rm -rf ...