Cod sursa(job #728152)

Utilizator lehman97Dimulescu David lehman97 Data 28 martie 2012 15:24:01
Problema Cele mai apropiate puncte din plan Scor 30
Compilator fpc Status done
Runda Arhiva educationala Marime 2.11 kb
type vec=record
x,y:int64;
end;

type vector=array[1..100000]of vec;
var     min:real;
        i:longint;
        n:int64;
        v2,v:vector;


function dist(a,b:vec):real;
var a1,a2:int64;
begin
a1:=abs(a.x-b.x);
a2:=abs(a.y-b.y);
dist:=sqrt(sqr(a1)+sqr(a2));
end;



procedure qsort2(var a:vector);

    procedure sort2(l,r: int64);
      var
         i,j:int64;
         x,y:vec;
      begin
         i:=l;
         j:=r;
         x:=a[(l+r) div 2];
         repeat
           while (a[i].y<x.y)or((a[i].y=x.y)and(a[i].x<x.x)) do inc(i);
           while (x.y<a[j].y)or((a[j].y=x.y)and(x.x<a[j].x)) do dec(j);
           if not(i>j) then
             begin
                y:=a[i];
                a[i]:=a[j];
                a[j]:=y;
                inc(i);
                j:=j-1;
             end;
         until i>j;
         if l<j then
           sort2(l,j);
         if i<r then
           sort2(i,r);
      end;

    begin
       sort2(1,n);
    end;












procedure qsort(var a:vector);

    procedure sort(l,r: longint);
      var
         i,j:longint;
         x,y:vec;
      begin
         i:=l;
         j:=r;
         x:=a[(l+r) div 2];
         repeat
           while (a[i].x<x.x)or((a[i].x=x.x)and(a[i].y<x.y)) do inc(i);
           while (x.x<a[j].x)or((a[j].x=x.x)and(x.y<a[j].y)) do dec(j);
           if not(i>j) then
             begin
                y:=a[i];
                a[i]:=a[j];
                a[j]:=y;
                inc(i);
                j:=j-1;
             end;
         until i>j;
         if l<j then
           sort(l,j);
         if i<r then
           sort(i,r);
      end;

    begin
       sort(1,n );
    end;






begin
assign(input,'cmap.in');reset(input);
assign(output,'cmap.out');rewrite(output);
readln(n);
min:=maxint;
for i:=1 to  n do
readln(v[i].x,v[i].y);
v2:=v;
qsort(v);

for i:=1 to n-1 do
if dist(v[i],v[i+1])-min<0.000000 then min:=dist(v[i],v[i+1]);
qsort2(v2);
for i:=1 to n-1 do
if dist(v2[i],v2[i+1])-min<0.000000 then min:=dist(v2[i],v2[i+1]);
writeln(min:0:6);
end.