解题思路: 1、宽度为6、5、4、3的产品都需单独用一个6*6的盒子装 一个6*6的盒子可以装四个宽度为3的产品,width3//4表示宽度为3的产品数除以4取整数 boxNum=width6+width5+width4+(1+width3//4) 2、一个宽度为6的产品需单独装一个盒子 一个宽度为5的产品需要和11个宽度为1的产品能装入一个盒子 一个宽度为4的产品需要和5个宽度为2的产品装入一个包裹盒子 一个6*6的盒子可以装四个宽度为3的产品 计算装完宽度为5的产品、宽度为4的产品、宽度为3的产品后宽度为1的产品、宽度为2的产品、宽度为3的产品还有好多剩余 3、leftWidth1=width1-width5*11 leftWidth2=width2-width4*5 leftWidth3=width3%4 可能出现的场景: (1)leftWidth2为负数,说明宽度为2的产品数不够填充宽度为4的空余处,需要宽度为1的产品继续填充多余的空格 leftWidth1=width1-width5*11+width2-width4*5 (2)leftWidth2为正数,leftWidth1没有剩余,leftWidth3有剩余,此时要考虑一个宽度为3的产品最多只能与5个宽度为2的装入一个盒子 (3)宽度为1、2、3的产品都剩余,此时要考虑一个宽度为3的产品最多只能与5个宽度为2的装入一个盒子,空余位置由宽度为1的产品填充
找规律:宽度为3的产品还剩1个,最多可装5个宽度为2的产品 宽度为3的产品还剩2个,最多可装3个宽度为2的产品 宽度为3的产品还剩3个,最多可装1个宽度为2的产品 即宽度为3的产品剩余width3(小于4),最多可装(7-2*width3)个宽度为2的产品
#搜狐集团2018秋季校招笔试题(技术类)包裹问题 #code:utf-8 import sys if __name__=="__main__": myList=[] while(True): inputVal=raw_input() if(list(map(int,inputVal.split()))==[0,0,0,0,0,0]): break myList.append(list(map(int,inputVal.split()))) lens=len(myList) width1,width2,width3=0,0,0 for i in xrange(lens): boxNum=0 #加上产品宽度为6,5,4的个数,以及产品宽度为3的个数myList[i][2]//4 (一个包裹可以装4个宽度为3的产品) boxNum=(boxNum+myList[i][5]+myList[i][4]+myList[i][3]+myList[i][2]//4) #判断产品宽度为3的产品,拼成多个一个盒子过后,还剩余多少个宽度为3的产品 myList[i][2]%4 width3=myList[i][2]%4 width2=myList[i][1]-myList[i][3]*5 #判断产品宽度为2的盒子,放在宽度为4的产品后还剩余多少个宽度为2的产品 width1=myList[i][0]-myList[i][4]*11 #判断产品宽度为1的盒子,放在宽度为5的产品后还剩余多少个宽度为1的产品 #print(u"第一趟装完宽度3、4、5、6后剩余的产品 width3:%d width2:%d width1:%d" %(width3,width2,width1)) if(width3>0): #宽度为3的产品有剩余 if (0<width2)and(width2<=(7-2*width3)): #产品宽度为2的个数能填满宽度为3剩余最大个数为7-2*width3,还有空余由宽度为1的填充 width1=width1-(36-width2*4-width3*9) #print(u"第二趟宽度为2的正好满足宽度为3的产品 width3:%d width2:%d width1:%d" %(width3,width2,width1)) if(width1>0): boxNum=boxNum+1+1+(width1-(36-width2*4-width3*9))//36 else: boxNum=boxNum+1 elif(width2>(7-2*width3)): #产品宽度为2的个数大于宽度为3所需的最大个数 width2UseForWidth3=7-2*width3 width2=width2-width2UseForWidth3 width1=width1-(36-width2UseForWidth3*4-width3*9) #print(u"产品宽度为2的个数大于宽度为3所需的最大个数 width3:%d width2:%d width1:%d" %(width3,width2,width1)) if(width1<=0): #宽度为3、2的产品有剩余 boxNum=boxNum+1+1+(width2*4)//36 elif(width1>0): boxNum=boxNum+1+1+(width1*1+width2*4)//36 elif(width2<0): #宽度为3、1的产品有剩余 if(width1>0): #宽度为1的产品还有剩余 width1=myList[i][0]-myList[i][4]*11+(myList[i][1]-myList[i][3]*5) if(width1<0): #只有宽度为3的产品有剩余 boxNum=boxNum+1 else: #只有宽度为1、3的产品有剩余 if((36-width3*9-width1)<0): boxNum=boxNum+1+1+(width1*1-36+width3*9)//36 else: boxNum=boxNum+1 else: #宽度为3的产品没有剩余 if(width1<0) and(width2>0): #只有宽度为2的产品有剩余 boxNum=boxNum+1+width2//9 elif(width1>0) and(width2<0): #只有宽度为1的产品有剩余 boxNum=boxNum+1+width1//36 elif(width1>0) and(width2>0): #只有宽度为1、2的产品有剩余 boxNum=boxNum+1+(width2*4+width1*1)//36 print str(boxNum)