SUHO2018校招笔试




此题虽然不是很难,但是感觉挺烧脑的...用贪心算法处理,从大的块开始处理,一直到小的块。

	while (true)
	{
		int num1,num2,num3,num4,num5,num6;//numi表示输入的i*i的数量
		int num=0,remain1=0,reminder,remain2=0;//remain1表示剩余可容纳1*1的个数,remain2表示剩余可容纳2*2的个数
		cin>>num1>>num2>>num3>>num4>>num5>>num6;
		if(num1==0&&num2==0&&num3==0&&num4==0&&num5==0&&num6==0)
			break;
		else
		{
			num+=num6;  //当出现6*6时,需要num6个包裹。
			num+=num5;  //当出现5*5时,需要num5个包裹。但是每个包裹仍然能有11个1*1可以使用;
			remain1=11*num5;
			num+=num4;  //当出现4*4时,需要num4个包裹。
			remain2+=5*num4; //每个包裹仍然能有5个2*2可以使用
			reminder=num3%4; //对于3*3,每个包裹能容下(6*6)/(3*3)=4个包装,但有可能剩余;
			num3=num3/4;
			if(reminder==0)
				num+=num3;
			else
			{
				num+=num3;
				num++;//当剩余非0时,则需要一个新的包裹
				if(reminder==1)
				{//剩余1时,即在本包裹中占用1个3*3的位置
					remain1+=7;
					remain2+=5;
				}
				else if (reminder==2)
				{//剩余2时,即在本包裹中占用2个3*3的位置
					remain1+=6;
					remain2+=3;
				}
				else
				{//剩余3时,即在本包裹中占用3个3*3的位置
					remain1+=5;
					remain2+=1;
				}
			}
			if (remain2>num2)
			{
				remain1+=(remain2-num2)*4;//如果大包裹的空隙完全可以装的下2*2,并且有剩余可以装1*1;
				num2=0;
			}
			else
				num2-=remain2;//如果大包裹的空隙不能完全装的下2*2,则需要额外申请空间
			reminder=num2%9;
			num2=num2/9;
			num+=num2;
			if(reminder!=0)
			{
				num++;
				remain1+=36-4*reminder;//2*2申请空间的剩余空间分给1*1;
			}
			if (remain1>num1)
			{
				num1=0;//如果空隙空间足以放置1*1,则不必再额外申请空间;
			}
			else
				num1-=remain1;
			reminder = num1%36;
			num1=num1/36;
			num+=num1;
			if(reminder!=0)
				num++;
		}
		cout<<num<<endl;
	}


猜你喜欢

转载自blog.csdn.net/LiuPeiP_VIPL/article/details/77657734