POJ 1017
题目链接:http://poj.org/problem?id=1017
读题用了好久,英语真的没底子可以混了,最后还是搜的题意:
一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个
型号,他们的长宽分别为 1*1, 2*2, 3*3, 4*4, 5*5, 6*6. 这些产品通常使用一个 6*6*h
的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的
包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由
你来设计。
输入数据
输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空
格隔开,分别为 1*1 至6*6 这六种产品的数量。输入文件将以 6 个0 组成的一行结尾。
输出要求
除了输入的最后一行6 个0 以外,输入文件里每一行对应着输出文件的一行,每一行输
出一个整数代表对应的订单所需的最小包裹数。
解题思路:
因为高度都是h,则无需考虑,只考虑底面积大小就可以。6*6的箱子,对于6*6,5*5,4*4,3*3的,只能放自己或尺寸比自己小的;所以先放大的,再用小的填空,
//6*6一个,
//5*5一个+11个1*1
//4*4一个+5个2*2
//3*3四个,或3个3*3+1个2*2,或2个3*3+3个2*2,或1个3*3+5个2*2,
提示:这里原本用的math.h中的ceil函数,结果wa了,不知道为什么……,要么自定义,要么加一个数再做除法……
以后遇到max这类不识别的问题的话,也可以考虑自定义……(一个小白的自我陈述)
#include<iostream> #include<stdio.h> #include<algorithm> #include<string.h> #include<math.h> using namespace std; //6*6一个,5*5一个+11个1*1 //4*4一个+5个2*2; //3*3四个 int main() { int a,b,c,d,e,f,N;//N存放盒子个数 while(~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; int u[4]={0,5,3,1}; //3*3的产品数目分别是4的倍数,4的倍数加1,4的倍数加2,加3剩余空间所能存放的2*2的个数 N=d+e+f+(c+3)/4; //先放只能放自己或比自己小的在一个盒子里 //然后计算剩余空间可以放多少个2*2 int y=d*5+u[c%4]; if(b>y) N+=ceil(b-y+8)/9; //计算1*1的 int x=N*36-b*4-c*9-d*16-e*25-f*36; if(a>x) N+=(a-x+35)/36; printf("%d\n",N); } return 0; }