[WC'2002]奶牛浴场

奶牛浴场

happy.exe

【问题描述】

由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少。为了讨好奶牛,John决定在牛场中建造一个大型浴场。但是John的奶牛有一个奇怪的习惯,每头奶牛都必须在牛场中的一个固定的位置产奶,而奶牛显然不能在浴场中产奶,于是,John希望所建造的浴场不覆盖这些产奶点。这回,他又要求助于Clevow了。你还能帮助Clevow吗?

John的牛场和规划的浴场都是矩形。浴场要完全位于牛场之内,并且浴场的轮廓要与牛场的轮廓平行或者重合。浴场不能覆盖任何产奶点,但是产奶点可以位于浴场的轮廓上。

Clevow当然希望浴场的面积尽可能大了,所以你的任务就是帮她计算浴场的最大面积。

【输入文件】

       输入文件的第一行包含两个整数L和W,分别表示牛场的长和宽。文件的第二行包含一个整数n,表示产奶点的数量。以下n行每行包含两个整数x和y,表示一个产奶点的坐标。所有产奶点都位于牛场内,即:0<x<L,0<y<W。

【输出文件】

       输出文件仅一行,包含一个整数S,表示浴场的最大面积。

【输入输出样例】

happy.in

happy.out

10 10

4

1 1

9 1

1 9

9 9

80

【参数约定】

  0<n<5000

  1<L,W<30000
-------------------------------------------------------------------------------------------------------------------
这题没有什么算法,关键在于细致的分析,分类讨论,排个序,然后就枚举吧,O(N^2);
-------------------------------------------------------------------------------------------------------------------
代码:

var
   l,w,n:longint;
   x,y:array[1..5000] of longint;
function min(a,b:longint):longint; begin if a<b then exit(a) else exit(b); end;
function max(a,b:longint):longint; begin if a>b then exit(a) else exit(b); end;
procedure swap(var a,b:longint); begin a:=a xor b; b:=a xor b; a:=a xor b; end;
procedure init;
var
   i:longint;
begin
     readln(l,w);
     readln(n);
     for i:=1 to n do readln(x[i],y[i]);
end;
function ans:longint;
var
   left,right,high,i,j:longint;
begin
     {init}
     ans:=0;
     {sort of y}
     for i:=1 to n-1 do
     for j:=i+1 to n do
         if y[i]>y[j] then begin
            swap(x[i],x[j]);
            swap(y[i],y[j]);
         end;
     {search one}
     for i:=1 to n do begin
         left:=0;
         right:=l;
         for j:=i+1 to n do
             if y[j]>y[i] then begin
                ans:=max(ans,(right-left)*(y[j]-y[i]));
                if x[j]<=x[i] then left:=max(left,x[j]);
                if x[j]>=x[i] then right:=min(right,x[j]);
                if left=right then break;
             end;
         ans:=max(ans,(right-left)*(w-y[i]));
     end;
     {sort of x}
     for i:=1 to n-1 do
     for j:=i+1 to n do
         if x[i]>x[j] then begin
            swap(x[i],x[j]);
            swap(y[i],y[j]);
         end;
     {search two}
     high:=w;
     for i:=1 to n do begin
         ans:=max(ans,high*x[i]);
         high:=min(high,y[i]);
         if high=0 then break;
     end;
     ans:=max(ans,high*l);
     for i:=1 to n do begin
         high:=w;
         for j:=i+1 to n do
             if x[j]>x[i] then begin
                ans:=max(ans,high*(x[j]-x[i]));
                high:=min(high,y[j]);
                if high=0 then break;
             end;
         ans:=max(ans,high*(l-x[i]));
     end;
     {end}
end;
procedure main;
begin
     assign(input,'happy.in');
     assign(output,'happy.out');
     reset(input);
     rewrite(output);
     init;
     write(ans);
     close(input);
     close(output);
end;
begin
     main;
end.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值