【贪心算法】POJ-1017
一、题目
Description
A factory produces products packed in square packets of the same height h and of the sizes 11, 22, 33, 44, 55, 66. These products are always delivered to customers in the square parcels of the same height h as the products have and of the size 6*6. Because of the expenses it is the interest of the factory as well as of the customer to minimize the number of parcels necessary to deliver the ordered products from the factory to the customer. A good program solving the problem of finding the minimal number of parcels necessary to deliver the given products according to an order would save a lot of money. You are asked to make such a program.
Input
The input file consists of several lines specifying orders. Each line specifies one order. Orders are described by six integers separated by one space representing successively the number of packets of individual size from the smallest size 11 to the biggest size 66. The end of the input file is indicated by the line containing six zeros.
Output
The output file contains one line for each line in the input file. This line contains the minimal number of parcels into which the order from the corresponding line of the input file can be packed. There is no line in the output file corresponding to the last ``null'' line of the input file.
Sample Input
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
Sample Output
2
1
二、思路&心得
- 题目大意为共有1 * 1、2 * 2...6 * 6的产品各a[i]个,包装袋大小固定为6 * 6,问最少最要多少个包装袋,可以把每个订单中所有产品包装起来。
- 这个题目有点类似硬币问题,在选择时从最大的6 * 6的产品开始依次往小进行计算。对于6 * 6、5 * 5、4 * 4的产品,各需要包装袋a[6]、a[5]、a[4]个,其中放置5 * 5产品的包装袋可以额外装11个1 * 1的产品,放置4 * 4产品的可以额外装5个2 * 2的产品;对于3 * 3的产品比较特殊,对4取模后,根据余数0、1、2、3分四种情况进行判断,每次选择时尽可能得装入更多的2 * 2的产品再装入1 * 1的产品;对于2 * 2和1 * 1的产品判断较为简单,不再多说。
- 在做这题时刚开始有点看不懂题意,便看了下discuss区,发现所有人都说这题非常非常难以及细节很多,导致不敢轻易下手。但是思路想清,WA了一两次之后,便AC了,好像也没想象中的那么难。
- 在网上观摩到大神的极短代码,算法思想非常精辟,特另附上,以供学习。
三、代码
我的渣解法:
#include<cstdio>
int a[7];
int ans;
void solve() {
ans += (a[4] + a[5] + a[6]);
a[1] -= a[5] * 11;
a[2] -= a[4] * 5;
if (a[2] < 0) {
a[1] += a[2] * 4;
}
ans += (a[3] / 4 + 1);
switch (a[3] % 4) {
case 0: {
ans --;
break;
}
case 1: {
if (a[2] > 0) {
a[2] -= 5;
if (a[2] < 0) {
a[1] += a[2] * 4;
}
a[1] -= 7;
} else {
a[1] -= 27;
}
break;
}
case 2: {
if (a[2] > 0) {
a[2] -= 3;
if (a[2] < 0) {
a[1] += a[2] * 4;
}
a[1] -= 6;
} else {
a[1] -= 18;
}
break;
}
case 3: {
if (a[2] > 0) {
a[2] -= 1;
a[1] -= 5;
} else {
a[1] -= 9;
}
break;
}
}
if (a[2] > 0) {
ans += a[2] / 9;
if (a[2] % 9 > 0) {
ans ++;
a[1] -= (9 - a[2] % 9) * 4;
}
}
if (a[1] > 0) {
ans += (a[1] + 35) /36;
}
printf("%d\n", ans);
}
int main () {
while (1) {
ans = 0;
for (int i = 1; i <= 6; i ++) {
scanf("%d", &a[i]);
}
if (!a[1] && !a[2] && !a[3] && !a[4] && !a[5] && !a[6]) break;
solve();
}
return 0;
}
大神的精辟解法:
#include<stdio.h>
int main()
{
int n,a,b,c,d,e,f,x,y;
int u[4]={0,5,3,1};
while(1)
{
scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0)
break;
n=d+e+f+(c+3)/4;
y=5*d+u[c%4];//在已有n个的情况下,能装下y个2*2的
if(b>y)
n+=(b-y+8)/9;//把多的2*2的弄进来
x=36*n-36*f-25*e-16*d-9*c-4*b;
if(a>x)
n+=(a-x+35)/36;//把1*1的弄进来
printf("%d\n",n);
}
return 0;
}
【贪心算法】POJ-1017的更多相关文章
- POJ 1017 Packets【贪心】
POJ 1017 题意: 一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为 1*1, 2*2, 3*3, 4*4, 5*5, 6*6. 这些产品通常 ...
- poj 1088 滑雪(贪心算法)
思想: (贪心算法 ,看到题目是中文才做的) 先对数组中的数据进行排序,从最小的数据计算 当前的顶点的可以滑行的最大值=max(周围可达的顶点的可以滑行的最大值)+1 这样计算最后产生的路径肯定是最大 ...
- POJ 2287 田忌赛马 贪心算法
田忌赛马,大致题意是田忌和国王赛马,赢一局得200元,输一局输掉200元,平局则财产不动. 先输入一个整数N,接下来一行是田忌的N匹马,下一行是国王的N匹马.当N为0时结束. 此题为贪心算法解答,有两 ...
- poj_1042 贪心算法
poj 1042 gone fishing 题目要求: 由有n个湖, 按照顺序排列,一个人从第一个湖向最后一个湖行进(方向只能从湖0到湖n-1),途中可以在湖中钓鱼.在每个湖中钓鱼时,开始的5分钟内可 ...
- poj_2709 贪心算法
poj 2709 painter 题目要求 给定涂料,每套涂料含有3-12种不同的颜色(开始时候给定选用的颜料套的颜色数目),且一套涂料中每种颜色均有50ml.且一套涂料中的任意三种不同的颜色各X m ...
- ACM 贪心算法总结
贪心算法的本质: 就是当前状态的最优解,它并不考虑全局. 什么是当前状态的最优解? 成本问题? https://www.cnblogs.com/xuxiaojin/p/9400892.html (po ...
- 贪心算法(Greedy Algorithm)
参考: 五大常用算法之三:贪心算法 算法系列:贪心算法 贪心算法详解 从零开始学贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以 ...
- 算法导论----贪心算法,删除k个数,使剩下的数字最小
先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4, ...
- LEETCODE —— Best Time to Buy and Sell Stock II [贪心算法]
Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...
- ACM_ICPC hdu-2111(简单贪心算法)
一道非常简单的贪心算法,但是要注意输入的价值是单位体积的价值,并不是这个物品的总价值!#include <iostream> #include <stdio.h> #inclu ...
随机推荐
- SVG动画总结
SVG可以在内部定义CSS动画样式,包括动画,如下面的格式: <svg> <defs> <style> </style> </defs>&l ...
- 【转】netty源码分析之LengthFieldBasedFrameDecoder
原文:https://www.jianshu.com/p/a0a51fd79f62 拆包的原理 关于拆包原理的上一篇博文 netty源码分析之拆包器的奥秘 中已详细阐述,这里简单总结下:netty的拆 ...
- 20155211 课下测试ch12补做
20155211 课下测试ch12补做 有关线程图,下面说法正确的是() A.图的原点表示没有任何线程完成一条指令的初始状态 B.向右向上是合法的转换 C.向左向下是合法的转换 D.对角线是合法的转换 ...
- Kubernetes学习之路(十六)之存储卷
目录 一.存储卷的概念和类型 二.emptyDir存储卷演示 三.hostPath存储卷演示 四.nfs共享存储卷演示 五.PVC和PV的概念 六.NFS使用PV和PVC 1.配置nfs存储 2.定义 ...
- 编译、安装rdesktop 1.8.3
来自:https://blog.csdn.net/songshimvp1/article/details/48290885 1.安装GCC: 安装C/C++编译器apt-get install gcc ...
- 解决 java循环中使用 Map时 在put值时value值被覆盖的问题
其实很简单,只需要把容器换成list 然后在循环中,每次循环末尾map = new HashMap() 或者直接在循环中一开始就实例化hashmap(Map map = new HashMap();) ...
- HTTP 请求/响应报文结构
请求报文和响应报文都是由以下4部分组成: 1.请求行/响应行 2.请求头/响应头 3.空行 4.消息主体(请求体/响应体) 请求报文结构 请求行 格式为:Method Request-URI HTTP ...
- RenderSprite小记
类型定义: /** @private */ public static const IMAGE:int = 0x01; /** @private */ public static const ALPH ...
- elasticsearch(全文检索)的介绍和安装
ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...
- Linux命令对应的英文及整体学习法
linux命令 注意一下内容收集与互联网,如果觉得有版权问题,请联系. 用Linux命令的时候,如果熟悉对应英文的含义,更有助于理解相应的命令.man: Manual 意思是手册,可以用这个命令查询其 ...