Poj 1017 Packets(贪心策略)
一、题目大意:
一个工厂生产的产品用正方形的包裹打包,包裹有相同的高度h和1*1, 2*2, 3*3, 4*4, 5*5, 6*6的尺寸。这些产品经常以产品同样的高度h和6*6的尺寸包袱包装起来运送给客户。工厂和客户最关心的就是尽量使用少的包裹来运送客户定的产品以减少费用。一个能计算运送产品所需最少包裹的程序能节约很多钱。你的任务就是编写这个程序。
输入:
输入文件包含若干行订单,每行表示一个订单。一个订单包含六个整数,用空格分开,表示产品尺寸对应的包裹个数,从最小尺寸1*1,到最大尺寸6*6,最后一行六个零表示输入结束。
输出:
输出文件一行对应输入文件的一行。这一行表示对应输入文件行订单所需最小的包裹数。对输入文件最后一行不用处理。
二、吐槽
在没有看到翻译之前,小弟真不知道题目什么意思。星幸亏有这位大哥的翻译啊,谢谢大哥啊,你的英语真好。
三、题解
这道题有用到贪心策略:
- 对于尺寸为6的包裹很简单,只要所求结果加尺寸为6个数即可。
- 对于尺寸为5的包裹的的话,1个最多只能填充11个尺寸为1 的包裹,所以所求结果加上5的个数,然后再用尺寸为1的包裹减去填充进尺寸为5的包裹即可。这里要注意尺 寸为1 的包裹数和填充的包裹数的数量不一,所以,在减的时候要减去尺寸为1 的包裹数和需要的最多填充数两者的最小值。
- 对于尺寸为4的包裹而言呢,即可填充尺寸为2的包裹也可以填充尺寸为1的包裹。这里采用贪心策略,首先先用尺寸为2的包裹填充,再用尺寸为1的包裹填充。这里最麻烦 的就是,2填充了多少,1又填充了多少。所以,专门写一个函数用于解决这个问题。这里是我一直很纠结的地方,后来参考了大神的方法,确实简单高效。
- 对于尺寸为3的包裹,情况和尺寸为4的差不多,不过它更复杂一点,因为它可以只填充它本身。所以就分为,它自身只有1、2、3的三种情况。
- 尺寸为2和1的情况相对简单一点。
四、java代码
import java.util.Scanner;
public class Main {
static int [] a=new int[7];;
public static void deal(int x,int y){
y-=Math.min(a[2],x)*4;
a[2]-=Math.min(a[2],x);
a[1]-=Math.min(a[1],y);
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int i,sum,temp,x = 0,y = 0;
while(cin.hasNext()){
int total=0;
for(i=1;i<=6;i++){
a[i]=cin.nextInt();
total+=a[i];
}
if(total==0)
break;
sum=a[6]+a[5]+a[4];
a[1]-=Math.min(a[1], a[5]*11);
deal(a[4] * 5,a[4] * 20);
sum+=(a[3]+3) / 4;
temp=a[3] % 4;
switch(temp){
case 0: x=0;y=0;break;
case 1: x=5;y=27;break;
case 2: x=3;y=18;break;
case 3: x=1;y=9;break;
}
deal(x,y);
sum+=(a[2]+8) /9;
if(a[2]%9!=0){
y=(9 - a[2] % 9) *4;
}else
y=0;
deal(0,y);
sum+=(a[1]+35) /36;
System.out.println(sum);
}
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
Poj 1017 Packets(贪心策略)的更多相关文章
- 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 Packets【贪心】
POJ 1017 题意: 一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为 1*1, 2*2, 3*3, 4*4, 5*5, 6*6. 这些产品通常 ...
- poj 1017 Packets 裸贪心
Packets Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 43189 Accepted: 14550 Descrip ...
- poi 1017 Packets 贪心+模拟
Packets Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 48349 Accepted: 16392 Descrip ...
- POJ 1017 Packets(积累)
[题意简述]:这个是别人的博客,有清晰的题意描写叙述.和解题思路,借助他的想法,能够非常好的解决问题! [分析]:贪心?模拟?见代码 //216K 16Ms #include<iostream& ...
- POJ 1O17 Packets [贪心]
Packets Description A factory produces products packed in square packets of the same height h and of ...
- 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 -3614 Sunscreen(贪心 + 优先队列)
http://poj.org/problem?id=3614 有c头奶牛在沙滩上晒太阳,每头奶牛能忍受的阳光强度有一个最大值(max_spf) 和最小值(min_spf),奶牛有L种防晒霜,每种可以固 ...
- poj 2431 Expedition 贪心 优先队列 题解《挑战程序设计竞赛》
地址 http://poj.org/problem?id=2431 题解 朴素想法就是dfs 经过该点的时候决定是否加油 中间加了一点剪枝 如果加油次数已经比已知最少的加油次数要大或者等于了 那么就剪 ...
随机推荐
- java 分布式锁 -图解- 秒懂
目录 写在前面 1.1. 分布式锁 简介 1.1.1. 图解:公平锁和可重入锁 模型 1.1.2. 图解: zookeeper分布式锁的原理 1.1.3. 分布式锁的基本流程 1.1.4. 加锁的实现 ...
- 关于Ninja中上传下载文件
上传得时候 根据类型来判断一下: 然后下载的时候需要:在url的最后一个/ 后面加上你要下载的类型如/download/app.apk; 下载成功就是app.apk了;
- python __name__及__main()__的妙处
#hello.py def sayHello(): str="hello" print(str); if __name__ == "__main__": pri ...
- ABAP下载xml文件
[转http://www.cnblogs.com/byfhd/archive/2007/08/17/859829.html] ************************************* ...
- 添加启动项及常用Windows+R
常用Windows+R services.msc---本地服务设置 msconfig---系统配置实用程序 mspaint--------画图板 notepad--------打开记事本 Nslook ...
- C#聚合运算方法
Aggregate 对集合值执行自定义聚合运算 Average 计算集合平均值 Count 对集合的元素惊醒计数,还可以仅对满足某一谓词函数的元素进行计数 LongCount 对大型集合中的元素进行计 ...
- where find
where查询不到返回ActiveRecord::Relation [] find返回异常ActiveRecord::RecordNotFound: Couldn't find where 查到返回 ...
- rails跨域请求配置
gem 'rack-cors', '~> 0.3.1'application.rb config.middleware.insert_before 0, "Rack::Cors&quo ...
- 【leetcode刷题笔记】Single Number
题目: Given an array of integers, every element appears twice except for one. Find that single one. No ...
- 3像素文本偏移bug 解决方案
<style>.box1{ width:100px; height:50px; float:left; background:#dedede;_margin-right:-3px;}.bo ...