Сайт підготовки до олімпіади з інформатики

програмування в С++

обчислювальна геометрія PDF Печать E-mail
Добавил(а) Administrator   
11.11.10 19:51

Обчислювальна геометрія

Література

Гісь І.В. Обчислювальна геометрія

Омелян П.П. Обчислювальна геометрія

Завдання та розв’язки ІІІ етапу Всеукраїнської учнівської олімпіади з інформатики в 2009-2010 н.р.

Другий тур

 

Задача VIОLАТION (20 балів)

В деякому місті шоферам заборонено при русі робити ліві повороти. За кожен такий поворот шофер повинен сплачувати штраф в розмірі М гривень. Для спостереження за рухом транспорту в місті встановлена комп'ютерна система, яка фіксує координати автомобіля на початку руху, в кінці та при кожному повороті.

Необхідно по заданій послідовності координат руху обчислити суму штрафу.

Вхідні дані: В першому рядку вхідного файлу VIOLATION.DAT записано N - кількість зафіксованих координат руху деякого автомобіля та М - величина штрафу, в наступних рядках координати автомобіля в процесі руху - (хi, уi), і=1,2,...,М, де (х1, у1) - точка початку руху, (хNN) - остання точка маршруту автомобіля.

Всі числа цілі та знаходяться в межах від -1000 до 1000.

Вихідні дані: Єдиний рядок вихідного файлу VIOLATION.SOL має містити суму штрафу.

Приклад:

 

 

 

VIOLATION.DAT

VIOLATION.SOL

5 50

 

 

 

50

 

0 0

 

 

 

 

 

2 0

 

 

 

 

 

1 1

 

 

 

 

 

5 1

 

 

 

 

 

5 -1

 

 

 

 

 

 

 

Розв’язок

{Визначення координат векторів}

x[n+1]:=x[1];

y[n+1]:=y[1];

for i:=1 to n do begin

a[i]:=x[i+1]-x[i];

b[i]:=y[i+1]-y[i];

end;

{Підрахунок кількості додатних добутків}

a[n+1]:=a[1];

b[n+1]:=b[1];

k:=0;

for i:=1 to n do

if a[i]*b[i+1]-a[i+1]*b[i]>0 then k:=k+1;

{Виведення результату}

writeln(k)

 

 

program violatio;

{$APPTYPE CONSOLE}

var x,y,a,b,vd:array[1..1000] of real;

s,n,i,j,k:integer;

f:text;

begin

{Задання координат вершин многокутника}

assign(f,'violatio.dat');

reset(f);

readln(f,n,s);

for i:=1 to n do

readln(f,x[i],y[i]);

close(f);

{Визначення координат векторів}

for i:=1 to n-1 do begin

a[i]:=x[i+1]-x[i];

b[i]:=y[i+1]-y[i];

end;

 

{Підрахунок кількості  від'ємних добутків}

k:=0;

for i:=1 to n-1 do

begin

vd[i]:=a[i]*b[i+1]-a[i+1]*b[i];

if vd[i]>0 then k:=k+s;

end;

{Виведення результату}

assign(f,'violatio.sol');

rewrite(f);

writeln(f,k);

close(f);

end.

 


 

Статистика

Пользователей : 261
Статей : 225
Просмотрено статей : 105613

Вход/Регистрация

Нет