Section 1.4 Packing Rectangles

时间:2023-03-09 09:30:11
Section 1.4 Packing Rectangles

本来是USACO Training的1.4.1的,但是介于今早过了食物链想起了这道题实在是太怨念了,翻出自己写的AC程序居然有5KB!!

思路很简单,枚举,而且就图中的六种情况。但是第六种变化状况太多了,我自己根本就没写出来后来是看别人写的分四种情况Blah Blah...

可参考此篇中的分析:http://blog.sina.com.cn/s/blog_5c717d190100qgkr.html

program packrec;
var r,rw,rt:array[..,..] of integer;
i,j,k,l,t,i1,j1,k1,l1:integer;
ans,anscount:integer;
ansx,ansy:array [..] of integer; procedure swap(var a,b:integer);
var t:integer;
begin
t:=a;a:=b;b:=t;
end; procedure panding(x,y:integer);
begin
if x*y<ans then
begin
ans:=x*y;
anscount:=;
ansx[anscount]:=x;
ansy[anscount]:=y;
exit;
end;
if x*y=ans then
begin
inc(anscount);
ansx[anscount]:=x;
ansy[anscount]:=y;
end;
end; procedure work;
var lx,ly,min,i,max:integer;
begin
{layout1}
lx:=rw[,]+rw[,]+rw[,]+rw[,];
ly:=;
for i:= to do
if rw[i,]>ly then ly:=rw[i,];
panding(lx,ly);
{layout2}
lx:=rw[,]+rw[,]+rw[,];
if rw[,]>lx then lx:=rw[,];
max:=;
for i:= to do
if rw[i,]>max then max:=rw[i,];
ly:=max+rw[,];
panding(lx,ly);
{layout3}
lx:=rw[,]+rw[,];
if rw[,]>lx then lx:=rw[,];
lx:=lx+rw[,];
ly:=rw[,]+rw[,];
if rw[,]>rw[,] then ly:=rw[,]+rw[,];
if rw[,]>ly then ly:=rw[,];
panding(lx,ly);
{layout4}
if rw[,]>rw[,] then lx:=rw[,] else lx:=rw[,];
lx:=lx+rw[,]+rw[,];
ly:=rw[,];
if rw[,]+rw[,]>ly then ly:=rw[,]+rw[,];
if rw[,]>ly then ly:=rw[,];
panding(lx,ly);
{layout5}
if rw[,]>rw[,] then lx:=rw[,] else lx:=rw[,];
lx:=lx+rw[,]+rw[,];
ly:=rw[,]+rw[,];
if rw[,]>ly then ly:=rw[,];
if rw[,]>ly then ly:=rw[,];
panding(lx,ly);
{layout6}
{if (rw[1,1]+rw[3,1]>rw[2,1]+rw[4,1]) then
lx:=rw[1,1]+rw[3,1]
else
lx:=rw[2,1]+rw[4,1];
if rw[1,2]+rw[2,2]>rw[3,2]+rw[4,2] then
ly:=rw[1,2]+rw[2,2]
else
ly:=rw[3,2]+rw[4,2];
if (rw[3,2]>rw[1,2]) and (rw[1,1]<rw[2,1]) then ly:=rw[2,2]+rw[4,2];
if (rw[1,1]>rw[2,1]) and (rw[3,2]>rw[2,2]) then ly:=rw[1,1]+rw[3,2];
if (rw[1,1]>rw[2,1]) and (rw[3,2]>rw[)}
if rw[,]+rw[,]>rw[,]+rw[,] then
ly:=rw[,]+rw[,]
else
ly:=rw[,]+rw[,];
if rw[,]>=rw[,]+rw[,] then
begin
lx:=rw[,];
if rw[,]+rw[,]>lx then lx:=rw[,]+rw[,];
if rw[,]+rw[,]>lx then lx:=rw[,]+rw[,];
end;
if (rw[,]>rw[,]) and (rw[,]>rw[,]+r[,]) then
begin
lx:=rw[,]+rw[,];
if rw[,]+rw[,]>lx then lx:=rw[,]+rw[,];
if rw[,]+rw[,]>lx then lx:=rw[,]+rw[,];
end;
if (rw[,]>rw[,]) and (rw[,]<rw[,]+rw[,]) then
begin
lx:=rw[,]+rw[,];
if rw[,]+rw[,]>lx then lx:=rw[,]+rw[,];
if rw[,]+rw[,]>lx then lx:=rw[,]+rw[,];
end;
if (rw[,]>=rw[,]+rw[,]) then
begin
lx:=rw[,];
if rw[,]+rw[,]>lx then lx:=rw[,]+rw[,];
if rw[,]+rw[,]>lx then lx:=rw[,]+rw[,];
end;
if rw[,]=rw[,] then
begin
lx:=rw[,]+rw[,];
if rw[,]+rw[,]>lx then lx:=rw[,]+rw[,];
end;
panding(lx,ly);
end; begin
assign(input,'packrec.in');reset(input);
assign(output,'packrec.out');rewrite(output);
ans:=;
for i:= to do
readln(r[i,],r[i,]);
for i:= to do
for j:= to do
if (j<>i) then
for k:= to do
if (k<>i) and (k<>j) then
for l:= to do
if (l<>i) and (l<>j) and (l<>k) then
begin
rw[,]:=r[i,];rw[,]:=r[i,];
rw[,]:=r[j,];rw[,]:=r[j,];
rw[,]:=r[k,];rw[,]:=r[k,];
rw[,]:=r[l,];rw[,]:=r[l,];
rt:=rw;
for i1:= to do
for j1:= to do
for k1:= to do
for l1:= to do
begin
rw:=rt;
if i1= then swap(rw[,],rw[,]);
if j1= then swap(rw[,],rw[,]);
if k1= then swap(rw[,],rw[,]);
if l1= then swap(rw[,],rw[,]);
work;
end;
end;
writeln(ans);
for i:= to anscount- do
for j:=i+ to anscount do
if ansx[i]<ansx[j] then
begin
swap(ansx[i],ansx[j]);
swap(ansy[i],ansy[j]);
end;
for i:= to anscount do
if (ansx[i]<>ansx[i-]) and (ansx[i]>=ansy[i]) then writeln(ansy[i],' ',ansx[i]);
close(input);close(output);
end.

packrec

通过日期是2013-11-08,也就是因为NOIP和学农撞日期旷课在家的那个周五0 0,简直是无法忘记那天有多么郁闷,备考的一天简直废在这题上面…⊙﹏⊙b