一、题目编号:
Problem R
二、简单题意:
一个工厂生产的产品高度都为h,大小为平方数,1*1,2*2,3*3,4*4,5*5,6*6,最后交给顾客的都是6*6的包裹,给出顾客需要的产品,怎样安排可以使包裹数量最少。
三、解题思路形成过程
利用贪心算法,通过局部最优以达到整体最优。这个题的贪心策略很简单,要使总包裹数量最少,就应该尽量让每个包裹都装满。考虑每种类型的产品,从大到小依次安排,6*6,5*5,4*4的产品每个都需要一个包裹,4个3*3可以放在一个包裹,再看2*2的,4*4和11个2*2的放在一起,3个3*3最多可以放5个2*2,2个3*3最多可以放3个2*2,3个3*3最多可以放1个2*2,多余的2*2只能再加包裹,其余空间都可以放1*1的。
四、感想
这个题每个方面都要考虑到,写代码时忘了一个包裹放4个3*3产品的情况,导致代码错误,还有要注意包裹数量应该向上取整。
五、AC代码
#include<iostream>using namespace std;
int main()
{
int a,b,c,d,e,f;
while(cin>>a>>b>>c>>d>>e>>f)
{
int sum=0,w=0,r;//sum记录包裹数,w记录包裹中能放2*2产品的数量
if(a+b+c+d+e+f==0)
break;
else
{
sum=d+e+f+(c+3)/4;
if(c%4==1)//一个包裹只放一个3*3的产品
w=5+d*5;
else if(c%4==2)//2个
w=3+d*5;//
else if(c%4==3)//3个
w=1+d*5;
else
w=d*5;
if(w<b)//2*2产品在当前包裹中放不开
sum+=((b-w+8)/9);
r=sum*36-b*4-c*9-d*16-e*25-f*36;
if(r<a)//1*1产品在当前包裹中放不开
sum+=((a-r+35)/36);
cout<<sum<<endl;
}
}
return 0;
}