ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1215. Точность попадания снаряда

why wa2?I have tried many tests,and output the right answer,but WA2
Послано uuu 1 сен 2010 20:20

 var
  i,j,k,n,m,tot:longint;
  ans,x1,y1,x2,y2,d1,d2,d3,x,y,angle1,angle2,t,p1,p2:double;

 function min(xx,yy:double):double;
  begin
   if xx>yy then exit(yy);
   exit(xx);
  end;

 begin
  {assign(input,'1215.in');reset(input);}
  read(x,y,n);
  read(x1,y1);
  p1:=x1;
  p2:=y1;
  d1:=sqrt(sqr(x-x1)+sqr(y-y1));
  ans:=999999999;
  tot:=0;
  for i:=2 to n do
   begin
    read(x2,y2);
    if (x1<x)and(x2>=x)and((y1<y)or(y2<y))
     then
      inc(tot);
    d2:=sqrt(sqr(x-x2)+sqr(y-y2));
    d3:=sqrt(sqr(x1-x2)+sqr(y1-y2));
    angle1:=(d2*d2+d3*d3-d1*d1)/(2*d2*d3);
    angle2:=(d1*d1+d3*d3-d2*d2)/(2*d1*d3);
    if (angle1>=0)and(angle2>=0)
     then
      begin
       if x1=x2
        then
         t:=abs(x1-x)
        else
         t:=((y1-y2)/(x1-x2)*x-y+y1+(y2-y1)/(x1-x2)*x1)/(sqrt(sqr((y1-y2)/(x1-x2))+1));
       t:=abs(t);
       ans:=min(ans,t);
      end
     else
      begin
       t:=min(d1,d2);
       ans:=min(ans,t);
      end;
    d1:=d2;
    x1:=x2;
    y1:=y2;
   end;
  x2:=p1;
  y2:=p2;
  if (x1<x)and(x2>=x)and((y1<y)or(y2<y))
     then
      inc(tot);
    d2:=sqrt(sqr(x-x2)+sqr(y-y2));
    d3:=sqrt(sqr(x1-x2)+sqr(y1-y2));
    angle1:=(d2*d2+d3*d3-d1*d1)/(2*d2*d3);
    angle2:=(d1*d1+d3*d3-d2*d2)/(2*d1*d3);
    if (angle1>=0)and(angle2>=0)
     then
      begin
       if x1=x2
        then
         t:=abs(x1-x)
        else
         t:=((y1-y2)/(x1-x2)*x-y+y1+(y2-y1)/(x1-x2)*x1)/(sqrt(sqr((y1-y2)/(x1-x2))+1));
       t:=abs(t);
       ans:=min(ans,t);
      end
     else
      begin
       t:=min(d1,d2);
       ans:=min(ans,t);
      end;
  if odd(tot)
   then
    ans:=0;
  writeln(ans*2:0:3);
 end.