Packing Rectangles 铺放矩形块

 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.


 

你可能感兴趣的:(NOIP2011黎明前夕的黑暗,usaco,模拟)