Packing Rectangles 铺放矩形块
IOI 95
给定 4 个矩形块,找出一个最小的封闭矩形将这 4 个矩形块放入,但不得相互重叠.所谓最小矩形指
该矩形面积最小.
所有4个矩形块的边都与封闭矩形的边相平行,图1示出了铺放4个矩形块的6种方案.这6种方案
仅只是可能的基本铺放方案.因为其它方案能由基本方案通过旋转和镜像反射得到.
可能存在满足条件且有着同样面积的各种不同的封闭矩形,你应该输出所有这些封闭矩形的边长.
PROGRAM NAME: packrec
INPUT FORMAT
共有 4 行.每一行用两个正整数来表示一个给定的矩形块的两个边长.矩形块的每条边的边长范围
最小是 1,最大是 50.
SAMPLE INPUT (file packrec.in)
1 2
2 3
3 4
4 5
OUTPUT FORMAT
总行数为解的总数加 1.第一行是一个整数,代表封闭矩形的最小面积(子任务 A).接下来的每一行
都表示一个解,由数 P 和数 Q 来表示,并且 P≤Q (子任务 B) .这些行必须根据 P 的大小按升序排列,P
小的行在前,大的在后.且所有行都应是不同的.
SAMPLE OUTPUT (file packrec.out)
40
4 10
5 8
============================
最后一种方案...
注意思考的顺序...
保证下面两个大...(因为早迟都要枚举的..)并且
在最后需要判断上面的宽度是否大于下面的宽度...
这也需要处理...
====================
{
ID:jie19952
PROG:packrec
LANG:PASCAL
}
type
re=record
x,y:longint;
end;
var
a:array[1..4,0..1]of longint;
f:array[1..50,1..50]of boolean;
max_num:array[1..10000]of re;
max_nums:longint;
max_ans:longint;
procedure init;
begin
assign(input,'packrec.in');
assign(output,'packrec.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
procedure swap(var a,b:longint);
var
t:longint;
begin
t:=a; a:=b; b:=t;
end;
function max(a,b:longint):longint;
begin
if a>b then exit(a);
exit(b);
end;
procedure main;
var
i:longint;
i1,i2,i3,i4,i_1,i_2,i_3,i_4:longint;
l,w:longint;
procedure work1;
begin
if l>w then swap(l,w);
max_num[max_nums].x:=l;
max_num[max_nums].y:=w;
end;
procedure pd;
begin
if (l*wi_2) then
for i_3:=1 to 4 do
if (i_1<>i_3) and (i_2<>i_3) then
for i_4:=1 to 4 do
if (i_2<>i_4)and(i_1<>i_4)and(i_3<>i_4) then
for i1:=0 to 1 do
for i2:=0 to 1 do
for i3:=0 to 1 do
for i4:=0 to 1 do
begin
{1}
l:=a[i_1,i1]+a[i_2,i2]+a[i_3,i3]+a[i_4,i4];
w:=max(a[i_1,1-i1],a[i_2,1-i2]);
w:=max(w,a[i_3,1-i3]);
w:=max(w,a[i_4,1-i4]);
pd;
{2}
l:=a[i_1,i1]+a[i_2,i2]+a[i_3,i3];
l:=max(l,a[i_4,i4]);
w:=max(a[i_1,1-i1],a[i_2,1-i2]);
w:=max(w,a[i_3,1-i3]);
w:=w+a[i_4,1-i4];
pd;
{3}
l:=max(a[i_1,i1]+a[i_2,i2],a[i_3,i3])+a[i_4,i4];
w:=max(a[i_1,1-i1],a[i_2,1-i2])+a[i_3,1-i3];
w:=max(w,a[i_4,1-i4]);
pd;
{4}
l:=max(a[i_1,i1],a[i_2,i2])+a[i_3,i3]+a[i_4,i4];
w:=max(a[i_1,1-i1]+a[i_2,1-i2],a[i_3,1-i3]);
w:=max(w,a[i_4,1-i4]);
pd;
{5}
if (a[i_1,i1]+a[i_2,i2]<=a[i_3,i3]+a[i_4,i4]) then
begin
l:=a[i_3,i3]+a[i_4,i4];//OK...
w:=max(a[i_1,1-i1]+a[i_3,1-i3],a[i_2,1-i2]+a[i_4,1-i4]);
if a[i_2,i2]>a[i_4,i4] then
begin
w:=max(w,a[i_3,1-i3]+a[i_2,1-i2]);
pd;
end
else
if a[i_1,i1]>a[i_3,i3] then
begin
w:=max(w,a[i_4,1-i4]+a[i_1,1-i1]);
pd;
end
else pd;
end;
end;
end;
procedure print;
var
i,j:longint;
tem:re;
begin
for i:=1 to max_nums-1 do
for j:=i+1 to max_nums do
if (max_num[i].x>max_num[j].x)or((max_num[i].x=max_num[j].x)and(max_num[i].y>max_num[j].y)) then
begin
tem:=max_num[i];
max_num[i]:=max_num[j];
max_num[j]:=tem;
end;
writeln(max_ans);
for i:=1 to max_nums do writeln(max_num[i].x,' ',max_num[i].y);
end;
begin
init;
main;
print;
terminate;
end.