ENG  RUSTimus Online Judge
Online Judge
Problems
Authors
Online contests
About Online Judge
Frequently asked questions
Site news
Webboard
Links
Problem set
Submit solution
Judge status
Guide
Register
Update your info
Authors ranklist
Current contest
Scheduled contests
Past contests
Rules
back to board

Discussion of Problem 1215. Exactness of Projectile Hit

Help! WA!
Posted by Илья Гофман (Ilya Gofman) 3 Nov 2002 18:01
This is my source code. Have any ideas about why is it WA?

{$N+}
program Exactness_Of_Projectile_Hit;
const  GMT=maxLongInt;
type   point=record
                   X:LongInt;
                   Y:LongInt;
             end;
       line=record
                   A:real;
                   B:real;
                   C:real;
            end;
var    Points:array[1..102] of point;
       Lines:array[1..102] of line;
       ans,AB,BC,AC,X,X1,Y1,X2,Y2:extended;
       N,i:LongInt;
       dop,dop1,Xv,Yv:extended;
       plus,minus:boolean;
procedure Quit;
begin
     writeln(0);
     halt;
end;
function min(a,b:extended):extended;
begin
     if a>b then
         min:=b else
         min:=a;
end;
function dist(a,b,c,d:extended):extended;
begin
     dop:=sqr(a-b);
     dop1:=sqr(c-d);
     dist:=sqrt(dop+dop1);
end;
begin
     ans:=GMT;
     readln(Xv,Yv,N);
     for i:=1 to N do
        readln(Points[i].X,Points[i].Y);
     {Checking if (Xv;Yv) is inside}
     Points[N+1]:=Points[1];
     for i:=1 to N do
     begin
          Lines[i].A:=Points[i+1].y-Points[i].y;
          Lines[i].B:=Points[i].x-Points[i+1].x;
          Lines[i].C:=Points[i].x*Points[i+1].y-Points[i].y*Points
[i+1].x;
     end;
     plus:=false;
     minus:=false;
     for i:=1 to N do
     begin
          if Lines[i].A*Xv+Lines[i].B*Yv>Lines[i].C then
              plus:=true else
          if Lines[i].A*Xv+Lines[i].B*Yv<Lines[i].C then
              minus:=true;
     end;
     if not (plus and minus) then
        Quit else
     {Counting the distance}
     begin
          for i:=1 to N do
          begin
               X1:=Points[i].x;
               X2:=Points[i+1].x;
               Y1:=Points[i].Y;
               Y2:=Points[i+1].Y;
               AB:=dist(x1,x2,y1,y2);
               BC:=dist(Xv,x2,Yv,Y2);
               AC:=dist(Xv,X1,Yv,Y1);
               X:=(sqr(AC)-sqr(BC)-sqr(AB))/(-2*AB);
               if (X>=0) and (x<=AB) then
                  ans:=min(ans,sqrt(sqr(BC)-sqr(X)));
          end;
          for i:=1 to N do
          begin
               X1:=Points[i].X;
               Y1:=Points[i].Y;
               ans:=min(ans,dist(X1,Xv,Y1,Yv));
          end;
     end;
     writeln(ans*2:0:3);
end.
Thanks, I got AC.
Posted by Илья Гофман (Ilya Gofman) 10 Nov 2002 22:13
> This is my source code. Have any ideas about why is it WA?
>
> {$N+}
> program Exactness_Of_Projectile_Hit;
> const  GMT=maxLongInt;
> type   point=record
>                    X:LongInt;
>                    Y:LongInt;
>              end;
>        line=record
>                    A:real;
>                    B:real;
>                    C:real;
>             end;
> var    Points:array[1..102] of point;
>        Lines:array[1..102] of line;
>        ans,AB,BC,AC,X,X1,Y1,X2,Y2:extended;
>        N,i:LongInt;
>        dop,dop1,Xv,Yv:extended;
>        plus,minus:boolean;
> procedure Quit;
> begin
>      writeln(0);
>      halt;
> end;
> function min(a,b:extended):extended;
> begin
>      if a>b then
>          min:=b else
>          min:=a;
> end;
> function dist(a,b,c,d:extended):extended;
> begin
>      dop:=sqr(a-b);
>      dop1:=sqr(c-d);
>      dist:=sqrt(dop+dop1);
> end;
> begin
>      ans:=GMT;
>      readln(Xv,Yv,N);
>      for i:=1 to N do
>         readln(Points[i].X,Points[i].Y);
>      {Checking if (Xv;Yv) is inside}
>      Points[N+1]:=Points[1];
>      for i:=1 to N do
>      begin
>           Lines[i].A:=Points[i+1].y-Points[i].y;
>           Lines[i].B:=Points[i].x-Points[i+1].x;
>           Lines[i].C:=Points[i].x*Points[i+1].y-Points[i].y*Points
> [i+1].x;
>      end;
>      plus:=false;
>      minus:=false;
>      for i:=1 to N do
>      begin
>           if Lines[i].A*Xv+Lines[i].B*Yv>Lines[i].C then
>               plus:=true else
>           if Lines[i].A*Xv+Lines[i].B*Yv<Lines[i].C then
>               minus:=true;
>      end;
>      if not (plus and minus) then
>         Quit else
>      {Counting the distance}
>      begin
>           for i:=1 to N do
>           begin
>                X1:=Points[i].x;
>                X2:=Points[i+1].x;
>                Y1:=Points[i].Y;
>                Y2:=Points[i+1].Y;
>                AB:=dist(x1,x2,y1,y2);
>                BC:=dist(Xv,x2,Yv,Y2);
>                AC:=dist(Xv,X1,Yv,Y1);
>                X:=(sqr(AC)-sqr(BC)-sqr(AB))/(-2*AB);
>                if (X>=0) and (x<=AB) then
>                   ans:=min(ans,sqrt(sqr(BC)-sqr(X)));
>           end;
>           for i:=1 to N do
>           begin
>                X1:=Points[i].X;
>                Y1:=Points[i].Y;
>                ans:=min(ans,dist(X1,Xv,Y1,Yv));
>           end;
>      end;
>      writeln(ans*2:0:3);
> end.
Re: Thanks, I got AC.
Posted by Ghalib Imtiyaz Ahmad 8 Apr 2003 03:22
What sort of modifications did you make to your code