【贪心算法】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 ...
随机推荐
- 使用C语言给php写扩展
1.在php源码路径的ext文件夹下,新建一个extend_test.def文件,编辑文件内容为 string my_test_function(string str,int n) 2.在当前目录执行 ...
- PHP原生开发的各大音乐平台API接口
支持以下音乐平台 网易云音乐 QQ音乐 酷狗音乐 酷我音乐 虾米音乐 百度音乐 一听音乐 咪咕音乐 荔枝FM 蜻蜓FM 喜马拉雅FM 全民K歌 5sing原创 5sing翻唱 若是数据获取失败 方案一 ...
- day 81 Vue学习一之vue初识
Vue学习一之vue初识 本节目录 一 Vue初识 二 ES6的基本语法 三 Vue的基本用法 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 vue初识 vue称为渐进式js ...
- kNN分类算法实例1:用kNN改进约会网站的配对效果
目录 实战内容 用sklearn自带库实现kNN算法分类 将内含非数值型的txt文件转化为csv文件 用sns.lmplot绘图反映几个特征之间的关系 参考资料 @ 实战内容 海伦女士一直使用在线约会 ...
- 数据结构与算法之链表(LinkedList)——简单实现
这一定要mark一下.虽然链表的实现很简单,且本次只实现了一个方法.但关键的是例子:单向链表的反转.这是当年我去H公司面试时,面试官出的的题目,而当时竟然卡壳了.现在回想起来,还是自己的基本功不扎实, ...
- Markdown新手快速入门基础教程
Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档. 当前许多网站都广泛使用 Markdown 来撰写帮助文档或是用于论坛上发表消息.例如:GitHub.简书.redd ...
- Web 前端性能优化相关内容解析
Web 前端性能优化相关内容,来源于<Google官方网页载入速度检测工具PageSpeed Insights 使用教程>一文中PageSpeed Insights 的相关说明.大家可以对 ...
- Noip前的大抱佛脚----字符串
目录 字符串 经验 用FFT求解字符串匹配问题 两(多)串DP时状态合并 最长公共子序列转LIS 位运算最大值 挂链哈希 哈希处理回文串 树哈希 字符串模板库 KMP 最小循环表示 Mancher A ...
- Caffe中Layer注册机制
Caffe内部维护一个注册表用于查找特定Layer对应的工厂函数(Layer Factory的设计用到了设计模式里的工厂模式).Caffe的Layer注册表是一组键值对(key, value)( La ...
- 安装 vagrant homestead步骤
vagrant box add laravel/homestead /Users/user/Downloads/virtualbox.box #virtualbox.box存放的位置 cd ~ g ...