В этом выпуске мы поговорим о предыдущей задаче и в конце выпуска я опубликую условие новой задачи. После первого выпуска я получил несколько писем с просьбой указать адрес моего сайта. К сожалению, я не на все письма смог ответить, поэтому объясняю ситуацию в выпуске: сайт находится в процессе разработки и поэтому будущий адрес неизвестен даже мне, как только я доделаю сайт, незамедлительно опубликую и ссылку на него. Кстати, как я уже говорил, на сайте я собираюсь публиковать турнирную таблицу, в связи с этим возник вопрос: публиковать ли 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.