<题目分析>
原则上永远是先装大的,再装小的。每一步装箱时先考虑把大的装进去,再考虑剩余空间的分配。
时间上O(1)。代码中很多地方可以简化。代码有错误或者不明白再问。
<参考程序>
var a:array[1..6] of longint;
i,sum:longint;
procedure pack6;
begin
inc(sum,a[6]);
a[6]:=0;
end;
procedure pack5;
begin
dec(a[1],a[5]*11);
inc(sum,a[5]);
a[5]:=0;
end;
procedure pack4;
var extra:longint;
begin
extra:=a[4]*20;
if a[2] >= a[4]*5 then dec(a[2],a[4]*5)
else
begin
dec(extra,a[2]*4);
a[2]:=0;
dec(a[1],extra);
end;
inc(sum,a[4]);
a[4]:=0;
end;
procedure pack3;
var num,extra,ex3:longint;
begin
num:=a[3] div 4;
ex3:=a[3] mod 4;
if ex3>0 then
begin
extra:=36-9*ex3;
if ex3=1 then if a[2]>=5 then dec(a[2],5)
else begin dec(extra,a[2]*4); a[2]:=0; dec(a[1],extra); end;
if ex3=2 then if a[2]>=3 then dec(a[2],3)
else begin dec(extra,a[2]*4); a[2]:=0; dec(a[1],extra); end;
if ex3=3 then if a[2]>=1 then dec(a[2],1)
else dec(a[1],9);
inc(num);
end;
inc(sum,num);
a[3]:=0;
end;
procedure pack2;
var num,extra,ex2:longint;
begin
num:=a[2] div 9;
ex2:=a[2] mod 9;
if ex2 > 0 then
begin
extra:=36-4*ex2;
dec(a[1],extra);
inc(num);
end;
inc(sum,num);
a[2]:=0;
end;
procedure pack1;
var num,ex1:longint;
begin
num:=a[1] div 36;
ex1:=a[1] mod 36;
if ex1>0 then inc(num);
inc(sum,num);
end;
begin
for i:=1 to 6 do read(a[i]);
sum:=0;
if a[6]>0 then pack6;
if a[5]>0 then pack5;
if a[4]>0 then pack4;
if a[3]>0 then pack3;
if a[2]>0 then pack2;
if a[1]>0 then pack1;
writeln(sum);
end.
楼上的程序过不了所有点,答案错误9%。。。。
路过