LEM1 - COIN

Tác giả: ll931110

Ngôn ngữ: Pascal

{$N+}
program LEM1;
uses math;
const
  input  = '';
  output = '';
  maxn = 10000 + 2;
  eps = 0.00000000001;
  eps2 = 0.0000000001;
  maxv = 1000000000;
var
  n: integer;
  a: array[1..maxn] of extended;
  res: extended;

procedure init;
var
  f: text;
  i: integer;
begin
  assign(f, input);
    reset(f);

  readln(f, n);
  for i := 1 to n do read(f, a[i]);
  a[n + 1] := a[1];

  close(f);
end;

function angle(x,y,z: extended): extended;
var
  t: double;
begin
  t := (y * y + z * z - x * x) / (2 * y * z);
  angle := arccos(t);
end;

procedure solve;
var
  inf,sup,med: extended;
  anl,tmp: extended;
  i: integer;
begin
  inf := 0;
  sup := 2 * maxv;
  tmp := 2 * pi;

  repeat
    med := (inf + sup) / 2;
    anl := 0;

    for i := 1 to n do
      anl := anl + angle(a[i] + a[i + 1],med + a[i],med + a[i + 1]);

    if abs(anl - tmp) < eps then
      begin
        res := med;
        exit;
      end;

    if anl < tmp then sup := med else inf := med;
  until sup - inf < eps2;

  res := (inf + sup) / 2;
end;

procedure printresult;
var
  f: text;
begin
  assign(f, output);
    rewrite(f);
    writeln(f, res:0:3);
  close(f);
end;

begin
  init;
  solve;
  printresult;
end.

Download