POJ Problem 1017

首先把题目说一下,防止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

相关文章
相关标签/搜索