首先把题目说一下,防止POJ改动后题号出问题 简单讲,就是要把11, 22, ..., 66的六种包装放在66的箱子里,高度都是同样的,求须要最少的箱子数ide
输入数据从左到右,用空格分开,每一个数对应包装数如 0 0 4 0 0 1 表示有四个33和一个66测试
输入数据每行为一组,描述一个测试用例 当某行出现六个0时,输入结束code
输出数据每行输出对应订单最少箱子数get
题目很简单,关键是解法 首先一点要明确,如何来装才是最少的 简单讲,如生命中的大石块里同样,先装大的 如何这样想:补位的时候确定要先用大的补位,小的能够补在更多的地方,不值得先用 因此在补位以前的顺序其实无所谓,即你先装33再往更大了装,最后装22和11也是同样的,由于补位从22开始io
那么很明确了,先处理66,再55,再……class
笔者用了很笨的方法,写了一个类,把箱子描述了一下,而后写了put方法,每次先把当前的包裹put_in_old_boxes,而后再把剩下的装箱 原理是没错的,可是大牛就是大牛,一样的原理就能写出以下极简的代码,在此多多膜拜。原理
本人代码就不献丑了,看了大牛的代码,无地自容啊方法
下面贴出大牛代码以下:数据
#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; //这里很巧妙,(c+3)/4正好是3*3所占用的箱数 y=5*d+u[c%4]; //这里是计算现有的空位能装多少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; // 计算在当前状况下还有多少个1*1空位 if(a>x) { n+=(a-x+35)/36; //多出来的1*1装箱 } printf("%d\n",n); //输出 } return 0; }
须要在线测试的同窗能够来此 1di