【贪心算法】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 ...
随机推荐
- WCF知识点记录
1:WCF有两种序列化器,XmlSerializer和DataContractSerializer,XmlSerializer能够直接对数据对象进行序列化输出,而DataContractSeriali ...
- Android远程擦除漏洞
漏洞原理: 安卓浏览器内核有这样一个机制,当网页内嵌入了一个特定格式的字符串,就可以被识别为一个电话号码通过点击该字符串的方式拨打电话.但是没有对*#06#等具有特殊功能的拨号组合进行限制,由于很多厂 ...
- 20155212 2016-2017-2 《Java程序设计》第9周学习总结
20155212 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 Chapter16 数据库本身是个独立运行的应用程序. 应用程序如何呼叫这组链接库? 不同的 ...
- Open-Xml SDK使用介绍
Office Open XML 简称为 ooxml ,是Microsoft 在 Office 2007 之后推行的标准格式,用在 Excel, Word, PPT 等文件.已确定为国际标准. Open ...
- 3 CRM 销售与客户 我的客户,公共客户池
1.销售与客户的表结构 1.公共客户与我的客户 ---公共客户(公共资源) 1.没有报名 2.3天没有跟进 3.15天没有成单 客户分布表 龙泰 男 yuan 2018-5-1 3天未跟进 龙泰 男 ...
- 微信小程序:实现日历功能
一.功能描述 实现日历功能 二. 代码实现 1. index.wxml <view class='wrap'> <view> <view class='date-show ...
- springmvc配置中,mapper一直依赖注入不进去的问题记录
问题还原: service层在引用mapper层接口时,一直依赖注入不进去.查看spring-context.xml配置,也未发现异常[因为以前就是这么配置],但是始终无法注入. 原因: 问题不出在s ...
- 解决table td里面长串数字或字母不换行的问题
在html中,经常要用到table标签,一般情况下,table下面的td元素里的东西都是汉字或者说是汉字.字母.数字的混合,在这种情况下,不设置table的宽度,也就是table宽度自适应的时候,浏览 ...
- Ubuntu 16.04.4 LTS环境中php7.0使用mysqli失败,数据库无法访问
环境: Ubuntu 16.04.4 LTS php7.0 输入命令php -m,显示如下,发现没有mysqli模块 输入命令sudo apt install php-mysql,安装mysql模块, ...
- 数学建模及机器学习算法(一):聚类-kmeans(Python及MATLAB实现,包括k值选取与聚类效果评估)
一.聚类的概念 聚类分析是在数据中发现数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好.我们事先并不知道数据的正确结果(类标),通过聚类算法来发现和挖掘数据本身的结 ...