题目
在一个二维平面里,有n块巧克力,每块巧克力都是长方形(正方形也可以认为是长方形),每块巧克力的四条边都平行于X轴或平行于Y轴。我们用(X1, Y1, X2, Y2)来描述一块巧克力的所在位置,其中(X1, Y1)表示这块巧克力左下角的坐标,(X2,Y2) 表示这块巧克力右上角的坐标。注意:题目给出的n块巧克力之间可能有重叠的地方。奶牛bessie手头上有一个a × b的长方形铁丝框. Bessie想知道它应该把铁丝框放在哪个位置,才能使得可以拿走的巧克力的个数最多?农夫FJ规定:bessie铁丝框放的位置也必须要平行X轴和Y轴,而且还规定,bessie只能拿走在铁丝框里面的巧克力,bessie最多能拿走多少块巧克力?bessie只能放一次铁丝框。解释:如果某块巧克力的位置是:(1,1, 2, 2), 而铁丝框的位置是(-1,1,2,100), 那么这块巧克力也是在铁丝框里面,可以被bessie拿走。也就是说,如果某块巧克力任何部分都没有超出铁丝框, 就可以认为是在铁丝框里面。
0 <= n <= 50
-10^9 <= X1, Y1, X2, Y2 <= 10^9
1 <= a , b <= 10^9
题解
发现坐标很大,数量很小呢
先上自己的水法:
枚举巧克力,以巧克力的4个顶点为铁丝框的顶点,然后弄出左下角的坐标和右下角的坐标(注意a,b可互换),判断
然后是正解:
离散,对坐标进行排序,然后枚举巧克力序号,这是就不用枚举坐标了,可以直接对坐标进行处理
代码
var
n,i,j,ans,a,b:longint;
x1,y1,x2,y2:array[1..50]of longint;
function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end;
function night(x,y,a,b:longint):longint;
var
i:longint;
begin
night:=0;
for i:=1 to n do
if (x1[i]>=x)and(y1[i]>=y)and(x2[i]<=a)and(y2[i]<=b) then
inc(night);
end;
begin
readln(n);
for i:=1 to n do
readln(x1[i],y1[i],x2[i],y2[i]);
readln(a,b);
for i:=1 to n do
begin
ans:=max(night(x1[i],y1[i],x1[i]+a,y1[i]+b),ans);
ans:=max(night(x1[i],y1[i],x1[i]+b,y1[i]+a),ans);
ans:=max(night(x2[i]-a,y2[i]-b,x2[i],y2[i]),ans);
ans:=max(night(x2[i]-b,y2[i]-a,x2[i],y2[i]),ans);
ans:=max(night(x1[i],y2[i]-b,x1[i]+a,y2[i]),ans);
ans:=max(night(x1[i],y2[i]-a,x1[i]+b,y2[i]),ans);
ans:=max(night(x2[i]-a,y1[i],x2[i],y1[i]+b),ans);
ans:=max(night(x2[i]-b,y1[i],x2[i],y1[i]+a),ans);
end;
writeln(ans);
end.