奶牛浴场
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.