出口胡萝卜 (贪心加暴力算法)
2015-11-28 01:03
267 查看
[b]题目描述[/b]
终于,Nova君饲养的小兔子们成精了,他们可以帮着赚钱啦。春天,兔子们播下胡萝卜的种子;夏天,兔子们耕耘;秋天,兔子们收获硕大无比的胡萝卜;冬天,兔子们把胡萝卜包装好,远销海内外。现在问题来了,Nova君希望削减包装的运输的成本,因而要尽可能少的用包装箱。兔子们种植的胡萝卜很奇葩,他们的长度都为H,但粗细度不一致,为了方便,事先把胡萝卜风干并且切成规则的长方体,规格为AAH,H为长度,A为横切面的边长。假设胡萝卜只有1x1xH,2x2xH,3x3xH, 4x4xH, 5x5xH, 6x6xH这6种规格,通常使用一个 6x6xH的长方体包裹包装然后邮寄给客户。
终于,Nova君饲养的小兔子们成精了,他们可以帮着赚钱啦。春天,兔子们播下胡萝卜的种子;夏天,兔子们耕耘;秋天,兔子们收获硕大无比的胡萝卜;冬天,兔子们把胡萝卜包装好,远销海内外。现在问题来了,Nova君希望削减包装的运输的成本,因而要尽可能少的用包装箱。兔子们种植的胡萝卜很奇葩,他们的长度都为H,但粗细度不一致,为了方便,事先把胡萝卜风干并且切成规则的长方体,规格为AAH,H为长度,A为横切面的边长。假设胡萝卜只有1x1xH,2x2xH,3x3xH, 4x4xH, 5x5xH, 6x6xH这6种规格,通常使用一个 6x6xH的长方体包裹包装然后邮寄给客户。
输入
多组测试数组(组数少于100),对于每组数据,输入一行,为6个正整数(int范围内),分别代表规格为 1x1xH 至6x6xH 这六种胡萝卜的数量。输出
对于每组数据,输出一行,为所需最少的包裹数。输入样例
0 0 4 0 0 1 7 5 1 0 0 0
输出样例
2 1 题目来源:http://biancheng.love/contest/23/problem/C/index 解题思路:同样采用贪心算法,不过这次的贪心算法很麻烦,但是思路很清晰。(好比做高中数学题) 首先讨论一下我们应该先发哪一种萝卜。 电脑没电了,先给出代码。白天补上详解。 详解来的有点晚了。(像素不高,但是过程还是表示滴挺清楚的) 代码:
#include <bits/stdc++.h> using namespace std; int a[7]; int main() { long long ans; while(~scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6])) { ans=a[6]; if(a[5]>0) { ans=ans+a[5]; a[1]=a[1]-11*a[5]; } if(a[4]>0) { ans=ans+a[4]; if(a[2]>=5*a[4]) a[2]=a[2]-5*a[4]; else { a[1]=a[1]-(20*a[4]-4*a[2]); a[2]=0; } } if(a[3]>0) { if(a[3]%4==0) ans=ans+a[3]/4; else { ans=ans+a[3]/4+1; if(a[3]%4==1) { if(a[2]>=5) { a[2]=a[2]-5; a[1]=a[1]-7; } else { a[1]=a[1]-(27-4*a[2]); a[2]=0; } } if(a[3]%4==2) { if(a[2]>=3) { a[2]=a[2]-3; a[1]=a[1]-6; } else { a[1]=a[1]-(18-4*a[2]); a[2]=0; } } if(a[3]%4==3) { if(a[2]>=1) { a[2]=a[2]-1; a[1]=a[1]-5; } else { a[1]=a[1]-9; } } } } if(a[1]<0) a[1]=0; if((a[2]*4+a[1])%36==0) ans=ans+(a[2]*4+a[1])/36; else ans=ans+(a[2]*4+a[1])/36+1; printf("%lld\n",ans); } }
简化代码:(思路相同)
#include<bits/stdc++.h> using namespace std; int main() { int a,b,c,d,e,f,x,y; int sum; int u[4]= {0, 5, 3, 1}; //对应的是当c%4 = 0, 1, 2, 3 时,剩余空间可放2*2大小的个数 while(~scanf("%d %d %d %d %d %d",&a,&b,&c,&d,&e,&f)) { sum = 0; if (a == 0 && b == 0 && c == 0 && d == 0 && e == 0 && f == 0) break; sum = f; //每个包裹只能转一个6*6的 sum += e;//每个包裹只能装一个5*5的 sum += d;//每个包裹只能装一个4*4的 sum += (c+3)/4;//每个包裹可以装4个 3*3的 y = 5*d + u[c%4]; if(b>y) sum += (b-y+8)/9; x = sum *36 - f*36 -e*25 - d*16 - c*9 - b*4; if(a>x) sum += (a-x+35)/36; printf("%d\n",sum); } }
相关文章推荐
- [Swoole入门]-异步毫秒定时器
- 【quick-cocos2dx从零开始做游戏】【一】前言与环境搭建
- 工业4.0时代:世界不再是你过去所知道的那样
- HDU 2955 Robberies
- UVALive 6523 Languages
- vsftp 服务配置篇
- HDU 2955 Robberies
- UESTC 1012 Ladygod 任意进制的转化
- POJ 3255 Roadblocks(dijkstra+邻接表求解次短路问题)
- 音频电路设计中的基本知识(-)
- 工厂方法模式与IoC/DI控制反转和依赖注入
- Educational Codeforces Round 2_B. Queries about less or equal elements
- Educational Codeforces Round 2_B. Queries about less or equal elements
- UESTC 1033 Marineking wilyin
- sublist分组list模拟代码
- 算法马拉松8(差和问题)
- android两种方法操作Sqlite数据库
- 机智零崎不会没梗Ⅲ (摊还分析)
- 适配器模式
- kettle中使用JavaScript的一个例子