e-olymp-751. Клад

Условие

Найти закопанный пиратами клад просто: всё, что для этого нужно – это карта. Как известно, пираты обычно рисуют карты от руки и описывают алгоритм нахождения клада так: «Встаньте около одинокой пальмы. Пройдите тридцать шагов в сторону леса, потом семнадцать шагов в сторону озера, …, наконец десять шагов в сторону большого булыжника. Клад находится под ним«. Большая часть таких указаний просто сводится к прохождению какого-то количества шагов в одном из восьми направлений ([latex]1[/latex] – север, [latex]2[/latex] – северо-восток, [latex]3[/latex]– восток, [latex]4[/latex] – юго-восток, [latex]5[/latex] – юг, [latex]6[/latex] – юго-запад, [latex]7[/latex] – запад, [latex]8[/latex] – северо-запад) (см. рис). Длина шага в любом направлении равна 1. Путешествие по такому пути обычно является прекрасным способом посмотреть окрестности, однако в наше время постоянной спешки ни у кого нет времени на это. Поэтому кладоискатели хотят идти напрямую в точку, где зарыт клад. Например, вместо того, чтобы проходить три шага на север, один шаг на восток, один шаг на север, три шага на восток, два шага на юг и один шаг на запад, можно пройти напрямую, использовав около 3.6 шага (см. рис).

prb751

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

Входные данные

Первая строка входного файла содержит число [latex]N[/latex] – число указаний $(1 ≤ N≤ 40)$. Последующие [latex]N[/latex] строк содержат сами указания – номер направления (целое число от 1 до 8) и количество шагов (целое число от 1 до 1000). Числа разделены пробелами.

Выходные данные

В выходной файл выведите координаты [latex]X[/latex] и [latex]Y[/latex] точки (два вещественных числа, разделённые пробелом), где зарыт клад, считая, что ось [latex]Ox[/latex] направлена на восток, а ось [latex]Oy[/latex] – на север. В начале кладоискатель должен стоять в начале координат. Координаты необходимо вывести с точностью [latex]10^{-3}[/latex].

Тесты

Ввод Вывод
1 6
1 3
3 1
1 1
3 3
5 2
7 1
3.000 2.000
2 1
8 10
-7.071 7.071

Код программы

Решение

Как видно из рисунка направление 1 совпадает с осью [latex]y[/latex], а 3 — с осью [latex]x[/latex]. Допустим, направление — переменная [latex]dir[/latex], а шаг-[latex]z[/latex]. Тогда, для направления 1 можно записать $y=z\cdot\cos((45^0)\cdot(dir — 1))$ , $x=z\cdot\sin((45^0)\cdot(dir-1)) $. Выражение $\cos((45^0)\cdot(1-1))=\cos(0^0)=1$ , то есть для 1 направления [latex]y=z[/latex], а выражение $\sin((45^0)\cdot(dir-1))=\sin((45^0)\cdot(1-1))=0 $. Следовательно, для направления 1 координаты [latex]y[/latex] и [latex]x[/latex] принимают значения: [latex]y=z[/latex], а [latex]x=0[/latex] .Рассмотрите значения приведенных выражений для всех направлений и увидим, что для всех направлений можно применить данные выражения для вычисления координат. А это позволяет сократить код программы.

Ссылки

Related Images:

e-olymp-1456. Барбос и Мухтар

Задача Барбос и Мухтар

Условие

На одной Большой Поляне росли два Больших Дерева – Большой Дуб и Большой Платан. К Большому Дубу были привязаны две собаки Барбос, длина цепи которого была равна $x$ метров, и Мухтар, длина его цепи $y$ метров. Однажды Барбосу надоело сидеть рядом с Мухтаром и он отбежал от Большого Дуба натянув свою цепь, Мухтар следуя примеру Барбоса, тоже решил подальше отбежать от Большого Дуба и тоже натянул свою цепь. Так они и сидели с натянутыми цепями, пока не заметили, что сидят на концах Прямой Тропы, на которой рос Большой Платан. Еще они заметили, что расстояние от Большого Дуба до Большого Платана равно расстоянию от Большого Дуба до Прямой Тропы. Также они не могли не заметить, что Барбосу в $z$ раз дальше бежать до Большого Платана по Прямой Тропе, чем Мухтару.

Каждая собака на Большой Поляне знает, что Большие Деревья – это материальные точки, а Прямая Тропа – отрезок прямой.

Помогите Барбосу и Мухтару узнать расстояние от Большого Дуба до Большого Платана.

Входные данные

Три вещественных числа $x$, $y$, $z$ (0 < $x, y, z $<[latex]10^7[/latex]) .

Выходные данные

Вывести расстояние от Большого Дуба до Большого Платана с 9 десятичными знаками. Если это расстояние найти невозможно, то вывести слово IMPOSSIBLE.

 

Входные данные Выходные данные
1 12 23 3 24.023426067
2 11 10 120 9.999927078
3 1 3 3 3.162277660

 Решение

Решение

Пусть о — расстояние между Дубом и большим Платаном. После введения $x$, $y$ и $z$ проверяем первое условие if: если длины цепей Барбоса и Мухтара совпадают, то, когда обе собаки добежали до прямой тропы, треугольник, образованный их натянутыми цепями и прямой тропой является равнобедренным. Расстояние от Дуба до прямой тропы — высота треугольника, проведенная его основанию. Также основание высоты — Большой Платан (по условию). По свойству высоты, проведенной из вершины равнобедренного треугольника к его основанию, получим, что расстояние от Барбоса до Большого Платана равно расстоянию от Мухтара до Большого Платана, что противоречит условию (Барбосу в $z$ раз больше бежать до Большого Платана по Прямой Тропе, чем Мухтару). Также равенство расстояний до Большого Платана мы проверяем далее в условии: $(z==1)$. Если $z$ равен $1$, то эти отрезки равны, и утверждение, написанное выше, будет неверным. Проходя эту проверку, мы смотрим, удовлетворяют ли введенные данные условию задачи. Если утверждения в if выполняются — выводим IMPOSSIBLE, так как условия задачи не выполняются. В противном случае пропускаем первый if — данные введены корректно. Следующий условный оператор проверяет, равен ли $z$ нулю. Если да, то выводим y, потому что в таком случае расстояние от Дуба до Бльшого Платана равно длине цепи Мухтара. Именно Мухтара, так как, по условию, Барбосу бежать до Большого Платана дольше. Если данное условие не выполняется, вычисляем расстояние между деревьями по формуле: $\frac{(yy-xxzz)}{double(1-zz)}$
Затем выводим расстояние, округлив его до 9 знаков после запятой .

Ссылки

Ссылка на e-olymp

Ссылка на ideone

Related Images:

e-olymp-248. Юный садовод

Задача Юный садовод

Условие

Мама попросила Васю полить все молодые деревца в саду. Вася знает, что пока деревья маленькие, их надо очень хорошо поливать. А вот сколько поливать — неизвестно. Но Вася — очень умный мальчик. Он внимательно прочитал весь учебник ботаники для средней школы и выяснил, что полив прямо пропорционален количеству листьев на дереве. Для хорошего роста деревьев достаточно выливать под дерево ежедневно по одному литру воды на каждый лист.prb248

К счастью Васи оказалось, что листья на деревьях растут ярусами, причем на верхнем ярусе два листа, на втором — четыре, на следующем — шесть, и так далее, на каждом последующем ярусе на два листа больше по сравнению с предыдущим. А на самой верхушке растет еще один листик. Хитрый Вася послал младшую сестренку Машеньку подсчитать количество ярусов на каждом дереве, а Вас просит написать программу, которая для каждого дерева вычислит количество литров воды для его полива.

 

Входные данные

Количество ярусов [latex] n(0≤n≤1000)[/latex]  на дереве.

Выходные данные

Вывести количество литров воды для полива этого дерева.

Тесты

Входные данные Выходные данные
1. 10 111
2. 0 1
3. 5 31
4. 123 15253

Линейное вычисление

Решение

Что бы решить эту задачу, необходимо найти сумму арифметической прогрессии, где [latex]  a_1=2[/latex] и   [latex] d=2 [/latex] и добавить к ней единицу (лист с верхушки).  Для этого можно воспользоваться формулой суммы арифметической прогрессии $S_n=\frac{2a_1+d(n-1)}{2}n$

Ссылки

Ссылка на e-olymp

Ссылка на ideone

Related Images: