POJ 1017 Packet
http://poj.org/problem?id=1017
有1*1 2*2...6*6的物品 要装在 6*6的parcel中 问最少用多少个parcel
一直没有找到贪心的策略
问题应该出现在 总是在想怎么放入parcel中 使得最节省空间
其实这种角度是很麻烦的 情况太多 很难描述清楚
但是其实 放一类型物品 得到的结果是非常具体的
-->>>即从要放的东西的角度出发
放 一个6*6 物品 会占用一个parce
放 一个5*5 物品 会占用一个parce 并且空出11个1*1的空位
放 一个4*4 物品 会占用一个parce 并且空出5个2*2的空位(可以转化为1*1的空位)
放3*3
:放一个 空出 5个2*2的空位 和7个1*1的空位
:放两个 空出 3个2*2的空位 和6个1*1的空位
:放三个 空出 1个2*2的空位 和5个1*1的空位
1*1 和 2*2 的物品作用是用来填补空位的
如果空位被填满 但是物品还未放完 就要再开一个新的parcel
2*2的物品放完后 将所有2*2的空位 变成 1*1的空位
#include <iostream>
#include <string.h>
#include <stdio.h> using namespace std;
//从 六种要装的物品考虑 装每一种物品会空出的空格的情况
int num[];
int main()
{
freopen("in.txt", "r", stdin);
int temp = ;
int parcel = ;
int space[];
while (~scanf("%d", &num[]))
{
temp = ;
temp |= num[];
memset(space, , sizeof(space));
parcel = ;
for (int i = ; i < ; i++)
{
scanf("%d", &num[i]);
temp |= num[i];
}
if (!temp) break;
parcel = num[] + num[] + num[];
space[] = num[] * ;//先解决 6*6,5*5,4*4 的包装盒
space[] = num[] * ;
//解决3*3的盒子
int p3 = , remain = ;
remain = num[] % ;
p3 = remain ? (num[]/)+ : num[]/;//如果还有剩余就多开一个盒子
parcel += p3;
switch(remain)//剩下多少个3*3的物品
{
case : space[] += ; space[] += ;break;
case : space[] += ; space[] += ;break;
case : space[] += ; space[] += ;break;
}
//然后解决 2*2 的盒子
remain = min(num[], space[]);
num[] -= remain;
space[] -= remain;
space[] += space[] * ;
if (num[])
{
remain = num[] % ;
if (remain)//如果还有剩余就多开一个盒子
{
parcel += num[] / + ;
space[] += *(-remain);
}
else
{
parcel += num[] / ;
}
}
//解决1*1
num[] -= min(num[], space[]);
if (num[])
{
remain = num[] % ;
parcel += remain ? num[] / + : num[] / ;//如果还有剩余就多开一个盒子 后面两个逻辑不严密 没有考虑清楚而出错
}
printf("%d\n", parcel);
}
return ;
}
POJ 1017 Packet的更多相关文章
- POJ 1017 Packets【贪心】
POJ 1017 题意: 一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为 1*1, 2*2, 3*3, 4*4, 5*5, 6*6. 这些产品通常 ...
- POJ 1017
http://poj.org/problem?id=1017 题意就是有6种规格的物品,给你一些不同规格的物品,要求你装在盒子里,盒子是固定尺寸的也就是6*6,而物品有1*1,2*2,3*3,4*4, ...
- Poj 1017 / OpenJudge 1017 Packets/装箱问题
1.链接地址: http://poj.org/problem?id=1017 http://bailian.openjudge.cn/practice/1017 2.题目: 总时间限制: 1000ms ...
- POJ - 1017 贪心训练
Packets Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 59725 Accepted: 20273 Descrip ...
- poj 1017 Packets 裸贪心
Packets Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 43189 Accepted: 14550 Descrip ...
- Greedy:Packets(POJ 1017)
装箱问题1.0 题目大意:就是一个工厂制造的产品都是正方形的,有1*1,2*2,3*3,4*4,5*5,6*6,高度都是h,现在要包装这些物品,只能用6*6*h的包装去装,问你怎么装才能使箱子打到最小 ...
- POJ 1017 Packets
题意:有一些1×1, 2×2, 3×3, 4×4, 5×5, 6×6的货物,每个货物高度为h,把货物打包,每个包裹里可以装6×6×h,问最少几个包裹. 解法:6×6的直接放进去,5×5的空隙可以用1× ...
- poj 1017 Packets 贪心
题意:所有货物的高度一样,且其底面积只有六种,分别为1*1 2*2 3*3 4*4 5*5 6*6的,货物的个数依次为p1,p2,p3,p4,p5,p6, 包裹的高度与货物一样,且底面积就为6*6,然 ...
- 【递归与分治】 poj 1017
递归与分治经典例题 要点在于对3*3箱子的讨论 #include <iostream> #include <cstdio> using namespace std; in ...
随机推荐
- Android系统级技巧合集
Android系统级技巧合集(随时更新) #转载请注明来源# 1.高通骁龙系列查看CPU体质等级 CPU体质,即为CPU在工作频率下的电压.同一批次的CPU体质各有不同,体质越高,代表该颗CPU可在更 ...
- 阿里云服务器ECS部署应用教程
购买阿里云服务器 大多数云服务器默认安装的语言运行环境版本都很旧了,python用的还是2.7,JDK用的还是1.6的,在ECS云服务器中可以自行安装,包括python3.4之类的. 在次页面购买EC ...
- SQLite – LIMIT子句
SQLite - LIMIT子句 SQLite LIMIT子句是用来限制SELECT语句返回的数据量. 语法: SELECT语句.LIMIT子句的基本语法如下: SELECT column1, col ...
- Android(java)学习笔记169:服务(service)之为什么使用服务
1.服务 service 长期在后台运行的进程,一般没有应用程序界面 2.进程线程和应用程序之间的关系 应用程序开启,系统启动一个Linux进程,所有的组件都是运行在同一个进程的同一个线程(mai ...
- 1-1 编程基础 GCC程序编译
GCC简介 Linux系统下的gcc是GNU推出的强大.性能优越的多平台编译器,是GNU的代表作之一.gcc可以在多种硬体平台上编译出可执行程序,其执行效率与一般的编译器相比平局效率要高20 ...
- JS的本地保存localStorage、sessionStorage用法总结
localStorage 生命周期是永久的 这意味着除非用户显示在浏览器提供的UI上清除localStorage信息,否则这些信息将永远存在. sessionStorage 生命周期为当前窗口或标签 ...
- node.js中使用Redis
服务端: 启动Redis服务: redis-server 客户端: 1.安装Redis npm install redis --save 2.redisTest.js文件 //引入red ...
- python基础一 day9 函数升阶(1)
函数 可读性强 复用性强def 函数名(): 函数体 return 返回值所有的函数 只定义不调用就一定不执行 先定义后调用 函数名() #不接收返回值返回值 = 函数名() #接收返回值 返回值 没 ...
- hibernate 入门配置
转自: https://segmentfault.com/a/1190000013568216
- Java中的反射--Reflect
在张孝祥老师的Java讲解中,学习到了Java反射的一部分知识,觉得有必要好好学习一下哈. 一.反射的理解 经典总结:反射就是把Java类中的各种成分映射成为相应的Java类 例如:一个Java类中用 ...