10.8 巧克力 2405

题目

在一个二维平面里,有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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值