Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Олимпиадные задачи с решениями на Turbo Pascal - Дмитрий


Информационный Канал Subscribe.Ru


Здравствуйте, уважаемые читатели.

    В этом выпуске мы поговорим о предыдущей задаче и в конце выпуска я опубликую условие новой задачи. После первого выпуска я получил несколько писем с просьбой указать адрес моего сайта. К сожалению, я не на все письма смог ответить, поэтому объясняю ситуацию в выпуске: сайт находится в процессе разработки и поэтому будущий адрес неизвестен даже мне, как только я доделаю сайт, незамедлительно опубликую и ссылку на него. Кстати, как я уже говорил, на сайте я собираюсь публиковать турнирную таблицу, в связи с этим возник вопрос: публиковать ли e-mail адрес рядом с именем участника. Мои сомнения связаны с тем, что многие могут побояться нежелательно спама, так что судите сами, стоит ли этого известность и всеобщее признание. Все Ваши мысли по этому поводу принимаю тут: tpascal@inbox.ru




   Переходим к задаче о кондукторах. Когда я публиковал условие этой задачи, у меня уже было моё решение, в котором я был почти уверен. Получив несколько Ваших решений, моя уверенность несколько уменьшилась, в связи с этим, публикую на всеобщее обозрение и моё решение, и решение, которое на мой взгляд наиболее близко к "правде". Жду с нетерпением Вашей критики опять же мне на e-mail. Итак, решение присланное kryll'ом (он прислал его первым):

{$q-,e+,r-,t+,i-,o-,p-,a+,s+,d-,f+,g-,l-,x+,v+,b-,n+}
{$m 65520,0,655360}
var
  n:integer;
  m,p,q:real;
  f1,f2:boolean;
begin
  assign(input,'input.txt');
  assign(output,'output.txt');
  reset(input);
  rewrite(output);
  read(p,q);
  p:=p/100;
  q:=q/100;
  m:=1.0;
  n:=0;
  if p=0 then
  begin
    m:=m/q;
    n:=trunc(m)+1;
    write(n);
    close(input);
    close(output);
    exit;
  end;
  if frac(m/p)=0 then
    f1:=true
  else
    f1:=false;
  if frac(m/q)=0 then
    f2:=true
  else
    f2:=false;
  while (not f1 and not f2 and (trunc(m/p)<=trunc(m/q))) or 
  (f1 and not f2 and (trunc(m/p)-1<=trunc(m/q)))
        or (not f1 and f2 and (trunc(m/p)<=trunc(m/q)+1)) or 
        (f1 and f2 and (trunc(m/p)-1<=trunc(m/q)+1)) do
  begin
    m:=m+1;
    if frac(m/p)=0 then
      f1:=true
    else
      f1:=false;
    if frac(m/q)=0 then
      f2:=true
    else
      f2:=false;
  end;
  m:=m/q;
  n:=trunc(m)+1;
  write(n);
  close(input);
  close(output);
end.

   Подобное же решение (одинаковые выходные данных на одинаковых входных) прислали: Kr@b и Зайцев Евгений.
Тесты, в которых расходятся наши решения:


input.txt
50
50.1
input.txt
12
12.03

   На данные входные данные их программа выводит 501 и 158 соответственно, с чем я не согласен (рассудите пожалуйста). Например, я не смог найти для первого теста такое кол-во кондукторов (целое число), чтобы их было строго больше 50% и строго меньше 50.1% от 501. Теперь привожу своё решение (надеюсь, именно оно наиболее правильно), которое на данные входные данные выдаёт 557 и 208 соответственно:

var
 p,q,x1,x2:real;
 n,x:LongInt;
begin
 assign (input,'input.txt');
 reset (input);
 readln (p,q);
 close (input);
 n:=1;
 p:=p+0.01;
 q:=q-0.01;
 while x=0 do begin
  x1:=(100*n)/p;
  x2:=(100*n)/q;
  if (trunc(x1)) > (trunc(x2)) then
    if trunc(x2) <> x2 then x:=trunc (x2)+1
    else if (trunc (x2) + 1) < (trunc (x1)) then x:= trunc (x2) + 1;
  n:=n+1;
   end;
 assign (output,'output.txt');
 rewrite (output);
 writeln (x);
 close (output);
end.

   В следующем выпуске, который я планирую выпустить в четверг), я опубликую решение (зависящее от Ваших мыслей по этому поводу) по данной задаче. В связи с сложившейся неразберихой, я не начислял балы ни кому из приславших свои решение, это я сделаю, когда определюсь, какие тесты всё же правильны, а какие - нет.


   Ну а теперь, новая задача. Очень прошу быть активнее, т. к. задачи несложные и каждый из Вас при желании может их решить.

Клад

   Найти закопанный пиратами клад просто: всё, что для этого нужно - это карта. Как известно, пираты обычно рисуют карты от руки и описывают алгоритм нахождения клада так: "Встаньте около одинокой пальмы. Пройдите тридцать шагов в сторону леса, потом семнадцать шагов в сторону озера, …, наконец десять шагов в сторону большого булыжника. Клад находится под ним". Большая часть таких указаний просто сводится к прохождению какого-то количества шагов в одном из восьми направлений (1 - север, 2 - северо-восток, 3 - восток, 4 - юго-восток, 5 - юг, 6 - юго-запад, 7 - запад, 8 - северо-запад). Длина шага в любом направлении равна 1.
Путешествие по такому пути обычно является прекрасным способом посмотреть окрестности, однако в наше время постоянной спешки ни у кого нет времени на это. Поэтому кладоискатели хотят идти напрямую в точку, где зарыт клад.
Вам необходимо написать программу, которая по указаниям пиратов определяет точку, где зарыт клад.
Формат входных данных.Первая строка входного файла содержит число N - число указаний (1<N>40). Последующие N строк содержат сами указания - номер направления (целое число от 1 до 8) и количество шагов (целое число от 1 до 1000). Числа разделены пробелами.
Формат выходных данных.В выходной файл выведите координаты X и Y точки (два вещественных числа, разделённые пробелом), где зарыт клад, считая, что ось Ox направлена на восток, а ось Oy - на север. В начале кладоискатель должен стоять в начале координат. Координаты необходимо вывести с погрешностью не более 0.001.


Например:
input.txt
6
1 3
3 1
1 1
3 3
5 2
7 1
output.txt
3.000 2.000
input.txt
1
8 10
output.txt
-7.071 7.071

   Желаю удачи в решении данной задачи и также жду от Вас ещё решение предыдущей задачи про кондукторов (всё ещё в рамках турнира).

Дмитрий
tpascal@inbox.ru


Рассылки Subscribe.Ru
Turbo Pascal для школьников    
Ищешь фильм? Зайди на мой сайт http://aslof.balzer.ru
Aslof aslof@mail.ru

Ищешь фильм? http://aslof.balzer.ru/
http://subscribe.ru/catalog/rest.cinema.filmforyou

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное