油滴扩展( box)

油滴扩展( box)

【问题描述】

在一个长方形框子里,最多有N(O≤Ns6)个相异的点。在其中任何~个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界。必须等一个油滴扩展完毕才能放置下一个油滴。那么应该按照怎样的顺序在这N个点上放置油滴,才能使放置完毕后所有油滴占据的总体积最大呢?(不同的油滴不会相互融合)

注:圆的面积公式V=pi*r*r,其中r为圆的半径。

【输入】

第一行一个整数N。

第二行为长方形边框一个顶点及其对角顶点的坐标,x,y,x’,y’。

接下去N行,每行两个整数XI,yi,表示盒子内N个点的坐标。

以上所有的整数都在[-1000,1000]内。

【输出】

一行,一个整数,长方形盒子剩余的最小空间(结果四舍五人输出)。

【输入样例】

  2

0 0 10 10

  3 3

  7 7

【输出样例】

  50

==========================

一个节点判断错了。。。。。

---------------------------------------

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!!!!!!!!!!!!!!!

!!!!!!!!!!!!!!!!!

==================

type
  re=record
       x,y:longint;
       r:extended;
     end;
var
  n:longint;
  x,y,x1,y1:longint;
  a,zhan:array[-1..6]of re;
  bool:array[1..6]of boolean;
  ans:extended;
procedure init;
begin
  assign(input,'box.in');
  assign(output,'box.out');
  reset(input); rewrite(output);
end;

procedure terminate;
begin
  close(input); close(output);
  halt;
end;

procedure swap(var a,b:longint);
var
  tem:longint;
begin
  tem:=a; a:=b; b:=tem;
end;

procedure dfs(t:longint;tot:extended);
var
  i,j:longint;
  r,ti:extended;
begin
  if t>n then
    begin
      if ans<tot then  ans:=tot;
      exit;
    end;
  for i:=1 to n do
    if bool[i] then
      begin
        bool[i]:=false;
        r:=maxlongint;
        for j:=-1 to t-1 do
          begin
            if (j=-1)or(j=0) then{注意}
              begin
                ti:=sqrt(sqr(a[i].x-zhan[j].x));
                if ti>sqrt(sqr(a[i].y-zhan[j].y)) then
                  ti:=sqrt(sqr(a[i].y-zhan[j].y));
              end
              else
                ti:=sqrt(sqr(zhan[j].x-a[i].x)+sqr(zhan[j].y-a[i].y))-zhan[j].r;
            if r>ti then r:=ti;
          end;
        //if r>0 then    {注意}
        if r<0 then r:=0;
        zhan[t].x:=a[i].x; zhan[t].y:=a[i].y; zhan[t].r:=r;
        dfs(t+1,tot+pi*r*r);
        bool[i]:=true;
      end;
end;

procedure main;
var
  i:longint;
begin
  readln(n);
  readln(x,y,x1,y1);
  if x>x1 then swap(x1,x);
  if y>y1 then swap(y1,y);

  for i:=1 to n do readln(a[i].x,a[i].y);

  fillchar(bool,sizeof(bool),true);
  zhan[0].x:=x; zhan[0].y:=y;  zhan[0].r:=0;
  zhan[-1].x:=x1; zhan[-1].y:=y1; zhan[-1].r:=0;
  ans:=0;
  dfs(1,0);
  writeln((x1-x)*(y1-y)-ans:0:0)
end;

begin
  init;
  main;
  terminate;
end.


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值