Описание
Новый градоначальник города Глупова решил с целью пополнения бюджета и экономии горючего провести кампанию борьбы с левым уклоном и левыми рейсами. Для этого он запретил водителям выполнять левые повороты, установив штраф за каждый такой поворот в размере одного миллиона (разворот на 180° поворотом налево не считается). От тяжелого прошлого Глупову достались улицы, которые могут пересекаться под любыми углами. Градоначальник приказал установить компьютерную систему тотальной слежки, которая следит за каждым автомобилем, записывая его координаты каждый раз, когда тот меняет направление движения (включая начальную и конечную точки пути).

Задание
Требуется написать программу, вычисляющую по записанной последовательности координат автомобиля штраф, который должен быть взыскан с водителя


Входные данные
В первой строке входного файла содержится целое число N – количество записанных пар координат (1
N1000). В каждой из следующих N строк записана очередная из этих пар

Выходные данные
Выведите в выходной файл суммарный штраф водителя в миллионах


Например:

FINE.IN
4
0 0
1 0
1 1
2 1


FINE
.OUT
1




Идеи
Векторная алгебра

Комментарии
В этой задаче, фактически, необходимо определить, в каком направлении происходит кратчайший поворот от одного вектора (x1,y1) до другого вектора (x2,y2) – по часовой стрелке или против. Представим на время, что рассматриваемые вектора находятся не в плоскости, а в пространстве, и рассмотрим их векторное произведение. Оно будет иметь компоненты (0,0,z), где z=x1y2-x2y1. Тогда из определения векторного произведения получаем следующий полезный факт: рассматриваемый поворот осуществляется против часовой стрелки тогда и только тогда, когда x1y2-x2y1>0
 




Решение

{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R-,S-,T-,V+,X+}

{$M 65520,0,655360}
 
Program Problem_A;
Var a:array[1..3] of record
                       x,y:real
                     end;
    Sum:word;
    h,n,i:integer;
 
BEGIN
  Assign(input,'fine.in'); Reset(input);
  Assign(output,'fine.out'); ReWrite(output);
  Sum:=0;
  Read(N);
  for i:=1 to n do
  begin
    inc(h);
    readln(a[h].x,a[h].y);
    if h=3 then begin
      if a[h-2].x*(a[h].y-a[h-1].y)+a[h-1].x*(a[h-2].y-a[h].y)+
         a[h].x*(a[h-1].y-a[h-2].y)<0 then inc(sum,1);
      a[1]:=a[2]; a[2]:=a[3]; dec(h)
    end
  end;
  writeln(sum);
  close(output);
END.

 


© Особенности национальных задач по информатике