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; }
相关文章推荐
- 2018链家校招内推-大数据开发工程师笔试编程题
- 阿里2018校招笔试编程题
- 【2018校招笔试-京东=java开发】题目2 求幂
- 2018校招三七互娱软件测试岗笔试题
- (网易2018校招笔试)[编程题] 字符串碎片
- 2018小红书校招软件研发在线笔试编程第二题
- (网易2018校招笔试)[编程题] 相反数
- 2018校招网易笔试——最长01交错子串
- 美图2018校招前端笔试编程题数组去重
- (网易2018校招笔试)[编程题] 魔法币 Magic Coin
- 2018校招唯品会软件测试岗在线笔试
- 【网易】2018校招笔试题
- 2018网易校招内推笔试-独立的小易(python)
- 美团2018校招笔试
- 2018美团校招前端笔试
- 阿里2018校招客户端研发笔试之编程题
- 2018京东校招笔试题-数据分析岗
- 唯品会2018校招机器学习、算法笔试题
- (网易2018校招笔试)[编程题] 字符串碎片
- 天上掉馅饼--移动研究院2018校招笔试题