您的位置:首页 > 其它

SUHO2018校招笔试

2017-08-28 21:49 239 查看




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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: