ex.dpr

来自「tongji acm-online judge solution」· DPR 代码 · 共 99 行

DPR
99
字号
(*
____E_______F____ l
____A       B_____
|   |_______|    |
|   C       D    |
|________________|

1/4 Circle A + 1/4 Circle B + (AC - R) + (BD - R) + CD - 2R > EF
Defining convexity better than concavity
So convexity hull!!!
*)
program Ural_1185(Input, Output);
const
    MaxN = 1000;
type
    TIndex = Longint;
    TData = Real;
    TPoint = record
        X, Y: TData;
    end;
    TPoints = array[1..MaxN + 1] of TPoint;
var
    P: TPoints;
    N: TIndex;
    L: TData;

function Distance(A, B: TPoint): TData;
begin
    Distance := Sqrt(Sqr(A.X - B.X) + Sqr(A.Y - B.Y));
end;

function GetCos(A, B, C, D: TPoint): TData;
begin
    GetCos := ((A.X - B.X) * (C.X - D.X) + (A.Y - B.Y) * (C.Y - D.Y)) / Distance(A, B) / Distance(C, D);
end;

procedure Swap(var A, B: TPoint);
var
    tmp: TPoint;
begin
    tmp := A;
    A := B;
    B := tmp;
end;

procedure Main;
var
    i, M: TIndex;
    MinInd: TIndex;
    S: TData;
begin
    Readln(N, L);
    for i := 1 to N do
        Readln(P[i].X, P[i].Y);
    MinInd := 1;
    for i := 2 to N do
        if (P[i].Y < P[MinInd].Y) or ((P[i].Y = P[MinInd].Y) and (P[i].X > P[MinInd].X)) then
            MinInd := i;
    Swap(P[MinInd], P[1]);
    P[N + 1] := P[1];
    MinInd := 2;
    for i := 3 to N do
        if ((P[i].X - P[1].X) / Distance(P[1], P[i])
            > (P[MinInd].X - P[1].X) / Distance(P[1], P[MinInd]))
            or (
            ((P[i].X - P[1].X) / Distance(P[1], P[i])
            = (P[MinInd].X - P[1].X) / Distance(P[1], P[MinInd]))
            and (Distance(P[1], P[i]) > Distance(P[1], P[MinInd]))) then
            MinInd := i;
    Swap(P[MinInd], P[2]);
    M := 2;
    repeat
        MinInd := M + 1;
        for i := M + 2 to N + 1 do
            if (GetCos(P[M], P[i], P[M - 1], P[M]) > GetCos(P[M], P[MinInd], P[M - 1], P[M]))
                or (
                (GetCos(P[M], P[i], P[M - 1], P[M]) = GetCos(P[M], P[MinInd], P[M - 1], P[M]))
                and (Distance(P[M], P[i]) > Distance(P[M], P[MinInd]))) then
                MinInd := i;
        Inc(M);
        Swap(P[M], P[MinInd]);
    until MinInd = N + 1;
    S := 0;
    for i := 2 to M do
        S := S + Distance(P[i - 1], P[i]);
    S := S + 2 * L * Pi;
    Writeln(Trunc(S) + Ord(Frac(S) >= 8 / 12));
end;
begin
    {Assign(Input, 'i.txt');
    Reset(Input);
    Assign(Output, 'o.txt');
    Rewrite(Output); }
    Main;
   { Close(Input);    
    Close(Output);     }
end.

⌨️ 快捷键说明

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