p2419.pas

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· PAS 代码 · 共 159 行

PAS
159
字号
PROGRAM p2319;

TYPE
        PosType=record
                x,y             :Longint;
        end;

VAR
        n                       :Longint;
        line                    :array[1..50001]of PosType;
        ball                    :array[0..50001]of Longint;

PROCEDURE Readin;
var
        min,i,num_miny          :Longint;
begin
min:=9999999;

for i:=1 to n do
        with line[i] do
                begin
                readln(x,y);
                if y<min then
                        begin
                        min:=y;
                        num_miny:=i;
                        end;
                end;

line[n+1]:=line[1];
line[1]:=line[num_miny];
line[num_miny]:=line[n+1];
for i:=2 to n do
        with line[i] do
                begin
                x:=x-line[1].x;
                y:=y-line[1].y;
                end;
with line[1] do
        begin
        x:=0;
        y:=0;
        end;
end;

PROCEDURE Sort(left,right:Longint);
var
        mid,i,j                         :Longint;
        key,temp                        :PosType;

        Function compare(var a,b:PosType):Longint;
        begin
        compare:=a.y*b.x-a.x*b.y;
        end;

begin
key:=line[left];
i:=left-1; j:=right+1;
repeat
        repeat dec(j); until compare(line[j],key)<=0;
        repeat inc(i); until compare(line[i],key)>=0;
        if (i<j) then
                begin
                temp:=line[i];
                line[i]:=line[j];
                line[j]:=temp;
                end else break;
until false;
if (j+1<right) then Sort(j+1,right);
if (left<i-1) then Sort(left,i-1);
end;

FUNCTION Check(v:Longint):Boolean;
var
        a,b                     :PosType;
        mul                     :Longint;
begin
with a do
        begin
        x:=line[ball[ball[0]-1]].x-line[ball[ball[0]]].x;
        y:=line[ball[ball[0]-1]].y-line[ball[ball[0]]].y;
        end;
with b do
        begin
        x:=line[v].x-line[ball[ball[0]]].x;
        y:=line[v].y-line[ball[ball[0]]].y;
        end;

if a.x*b.y-b.x*a.y>0 then Check:=true
        else Check:=false;
end;

PROCEDURE Main;
var
        i,j,k                   :Longint;
        ans,first,second        :Extended;

        Function area(var a,b,c:Longint):Extended;
        begin
        area:=abs(
        (line[a].x-line[b].x) * (line[c].y-line[b].y)
                                -(line[a].y-line[b].y) * (line[c].x-line[b].x));

        end;

begin

Sort(2,n);

ball[0]:=2;
ball[1]:=1;
ball[2]:=2;

for i:=3 to n do
        begin
        while check(i) do
                dec(ball[0]);
        inc(ball[0]);
        ball[ball[0]]:=i;
        end;


ans:=-1;
first:=0;

k:=0;
for i:=1 to ball[0] - 2 do
        begin
        dec(k,200);
        for j:=i+1 to ball[0] - 1 do
                begin
                if (k<=j) then k:=j+1;
                first:=area(ball[i],ball[j],ball[k]);
                if first>ans then ans:=first;

                while (k+1<=ball[0]) do
                        begin
                        second:=area(ball[i],ball[j],ball[k+1]);
                        if second<first then break;
                        inc(k);
                        first:=second;
                        if first>ans then ans:=first;
                        end;
                end;
        end;

ans:=ans / 2;
writeln(ans:0:2);
end;

BEGIN
readln(n);
while (n>0) do
        begin
        Readin;
        Main;
        readln(n);
        end;
END.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?