poj1017——Packets

题目大意:将高度相同的小盒子装入6*6的大盒子中,正方形底面的小盒子有六种型号,底面边长分别为1~6,问最多用几个大盒子

输入:六中型号的小盒子的个数

         结束:六个0

输出:最小大盒子个数

分析:贪心法。

代码:转载自https://blog.csdn.net/whuxiaoqiang/article/details/7705380

#include <stdlib.h>
#include <stdio.h>
 
int main()
{
	int N, a, b, c, d, e, f, y, x;
	//N表示使用的箱子的数目,a-f一次表示1*1--6*6规格物品的个数
	//x y是编码时使用的一个技巧,x表示1*1的剩余空间数,y表示2*2 
	
	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 = f+e+d+(c+3)/4; //先计算大块头的物品6*6和5*5和4*4以及3*3的物品所需要的箱子
		y = d*5; //6*6和5*5的物品均不剩下2*2的空间,一个箱子装一个4*4的物品剩下5个2*2的空间
		if( c%4 == 3)   //一个箱子能放下4个3*3的物品,c%4表示装好后还剩几个3*3的箱子
			y += 1;
		else if( c%4 == 2) 
			y += 3;
		else if( c%4 == 1)
			y += 5; //这里是关键,把这一个3*3的物品摆放在中间的位置才有可能放入5个2*2的物品
		if( y < b)
			N += ((b-y)+8)/9; //如果2*2的剩余空间不够,那么就需要新开箱子 
		
		x = 36*N - 36*f - 25*e - 16*d - 9*c - 4*b;  //计算剩余的1*1的空间用了一个比较好的方法
		
		if( x <a)
			N += ((a-x)+35)/36; //如果1*1的空间不够,那么就需要开新的箱子
			
		printf("%d\n", N);
	}
	
	system("pause");
	return 0;
} 
		 
	 

猜你喜欢

转载自blog.csdn.net/tzyshiwolaogongya/article/details/80976246