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

Задача взята с сайта e-olymp.com.

Условие задачи

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

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

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

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

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

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

Тесты

Входные данные Выходные данные
1. 2 7
2. 5 31
3. 0 1
4. 70 4971

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

Решение

Как можно было заметить, по условию нашей задачи, на каждом следующем уровне на 2 листа больше чем на предыдущем. Поэтому для ее решения мы можем воспользоваться формулой суммы [latex]n[/latex]-первых членов арифметической прогрессии, и в конце расчетов добавить к полученной сумме единицу (тот самый листик с верхушки). Тогда подставив [latex] d = 2 , a_1 = 2, n = n [/latex]. Мы получим формулу [latex] S_n = \frac{2a_1 + (n — 1)d}{2} \cdot n \to n^2 + n [/latex].

 

Оригинальное решение: cpp.mazurok.com.
Рабочий код для тестирования на try.haxe.org: Try Haxe !

e-olymp 6277. Покупка воды

Ссылка на оригинальную статью
Ссылка на e-olymp.com.

Задача
Стоимость бутылки воды, учитывая стоимость пустой бутылки, составляет $1$ грн $20$ коп., а стоимость пустой бутылки $20$ коп.
Сколько бутылок воды можно выпить на $n$ грн, учитывая, что пустые бутылки можно сдавать, и на полученные деньги приобретать новые бутылки воды.

Входные данные
Натуральное число $n$ $(1≤n≤1000)$.

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

Примечание: Вода без бутылки не продаётся.

Тесты

Входные данные Выходные данные
1 0,7 0
2 2 1
3 10 9
4 999 998

Код

Решение
Вводим переменную $n$ равную числу заданных денег. Так как при покупки и возвращении бутылки тратится $1$ грн, количество купленной воды будет на одну меньше, чем количества купюр. Чтобы «избавиться» от монет (десятичной части числа) при получении количества бутылок воды, округляем конвертируем переменную в целочисленный тип с округлением в сторону $0$.

Альтернативный вариант

Решение
Вводим переменную $n$ равную числу заданных денег и счетчик купленной воды. В цикле отнимаем от переменной $1$, так как при возвращении бутылки тратится лишь $1$ грн, а счетчик купленной воды увеличиваем на $1$.

ML 36. Движение катера

Условие

Катер движется по течению реки из пункта в A в пункт B и обратно с собственной скоростью [latex]v[/latex] км/час. Скорость течения постоянна — [latex]u[/latex]  км/час. Расстояние между пунктами составляет [latex]s[/latex]  км. Для любых неотрицательных действительных значений расстояния и скоростей вычислите время в пути.

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

Физические величины: [latex]v[/latex] , [latex]v[/latex] , [latex]v[/latex]

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

Физическая величина [latex]t[/latex]

Решение

По условию, мы проверяем любые неотрицательные действительные значения, следовательно условие, что [latex]t[/latex] не может быть меньше нуля не выполняется только если скорость течения будет превышать скорость катера (т.е. он не сможет плыть против него).  При нарушении этого условия или при получении 0 в знаменателе будем выводить -1.
Время в пути можно найти по формуле: [latex]t=\frac{s}{v}[/latex]

Так как к нашему условие добавляется влияние течения, то  скорость по его направлению будет

[latex]v+u[/latex], а против — [latex]v-u[/latex]. Следовательно получаем формулу для нахождения времени, необходимого на преодоление пути от А до В и обратно:

[latex]t=\frac{s}{(v+u)} + \frac{s}{(v-u)}[/latex]

На TryHaxe!

Тесты

s v u t
  6   1   2   -1
  6   2   1   8
  60   12   4   11.25

ML5

Оригинал задачи тут
Тесты задачи на TryHaxe

Условие:

Даны два действительных числа. Найти среднее арифметическое этих чисел и среднее геометрическое их модулей.

Алгоритм решения:

Нам необходимо найти среднее арифметическое чисел, которое представляет собой сумму всех зафиксированных значений, делённую на их количество. Для нашей задачи формула приобретает следующий вид: [latex] A = \frac{a+b}{2}.[/latex]
Для нахождения среднего геометрического модулей двух чисел воспользуемся формулой [latex] G = \sqrt{|a×b|}.[/latex]

 

Тесты:

Первое число Второе число Среднее арифметическое Среднее геометрическое
3 9 6 5.19615
156 82 119 113.102
-544.59 -12 -278.295 80.8398

ML21

Просмотреть рабочий код можно здесь
Ссылка на задачу, решённую на С++
Задача. Найти сумму членов арифметической прогрессии $a, a + d, a + 2d, \dots, a + (n — 1)d$ по заданным значениям $a$, $d$ и $n$

Тесты

$a$ $d$ $n$ $S_{n}$
8 657 0 0
5 0 2 10
2 2 2 6
5 8 1 5
0 5565 88 21302776

Код

Алгоритм

Для выполнения задачи была использована формула суммы арифметической прогрессии — [latex] S_{n} = \frac{2a_{1} + d(n — 1)}{2} * n [/latex]. $a_{1}$ — первый член арифметической прогрессии, $d$ — разница арифметической прогрессии и $n$ — номер последнего члена суммы. В выходной поток подаётся результат вычислений по данной формуле

ML38. Максимальный размер прямоугольника, вырезанного из круга

Задача

Какого наибольшего размера прямоугольник можно вырезать из круга диаметра d, если известно, что длины его сторон образуют золотую пропорцию.

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

Единственное число — диаметр окружности.

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

Два числа — длины сторон прямоугольника.

Рисунок 1

Тесты

Входные данные Выходные данные
[latex]d[/latex] [latex]a[/latex] [latex]b[/latex]
1 0 0 0
2 1 0.850651 0.525731
3 2 1.7013 1.05146
4 21 17.8638 11.0404
5 0.32 0.272208 0.168234
6 1.7 1.44611 0.893743
7 134 113.981 70.448

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

Выполнение кода на Try Haxe !

Решение

Прямоугольник будет иметь наибольший размер в случае, когда его вершины лежат на окружности. Тогда, очевидно, диаметр окружности будет диагональю данного прямоугольника. Согласно условию, длины его сторон образуют золотую пропорцию. Это означает, что [latex]\frac { a }{ b } =\phi [/latex], где [latex]a[/latex] — длина большей стороны прямоугольника, [latex]b[/latex] — длина его меньшей стороны, а [latex]\phi=\frac { 1+\sqrt { 5 } }{ 2 } [/latex]. Отсюда [latex]a=b\cdot \phi[/latex]. По теореме Пифагора, [latex]{ a }^{ 2 }+{ b }^{ 2 }={ d }^{ 2 }[/latex]. Путём подстановки из предыдущего выражения и простых алгебраических преобразований получим формулу для вычисления длины меньшей стороны: [latex]b=d\cdot \sqrt { \frac { 1 }{ { \phi }^{ 2 }+1 } } [/latex].
Сначала для удобства находим значение [latex]\phi[/latex], затем — по указанным формулам длины сторон прямоугольника.

Решение этой задачи на С++.

e-olymp 57. Бабочка-санитар

Задача взята с сайта e-olymp.com.
Решение на с++

Условие

Школьники, идя из дому в школу или наоборот — со школы домой, любят кушать конфеты. Но, как всегда, это приятное дело иногда имеет неприятные последствия – детки часто выбрасывают обертки на школьном дворе.

Мурзик всегда следил за чистотой школьного двора и ему в этом с радостью помогали бабочки, благодарные за прекрасные фотографии, сделанные им. Бабочки могли использовать собственные крылышки как линзы, причем они могли изменять их фокусное расстояние. Заметив обертку от конфетки, лежавшую на школьном дворе в точке с координатами [latex]X_1[/latex], [latex]Y_1[/latex], бабочка перелетала в точку с координатами [latex]X_2[/latex], [latex]Y_2[/latex], [latex]Z_2[/latex], расположенную на пути солнечных лучей к обертке и, изменяя фокусное расстояние своих крылышек-линз, сжигали обертку от конфеты.

Какую оптическую силу [latex]D[/latex] имели крылышки-линзы бабочки в этот момент?

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

В первой строке 2 числа: координаты [latex]X_1[/latex], [latex]Y_1[/latex] обертки от конфетки. Во второй – 3 числа: координаты [latex]X_2[/latex], [latex]Y_2[/latex], [latex]Z_2[/latex] бабочки в момент сжигания обертки.

Все входные данные целые числа, не превышающие по модулю 1000.

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

Единственное число – оптическая сила крылышек-линз [latex]D[/latex].

Код

Ход решения:

Вычисляем оптическую силу линзы [latex]D[/latex] по формуле [latex]D=\frac{1}{f}
[/latex], где [latex]f[/latex] — расстояние между бабочкой и обёрткой. Вычисляем его по формуле: [latex]f =
\sqrt{(X_2-X_1)^2+(Y_2-Y_1)^2+Z_2^2}[/latex].

Объем тетраэдра

Найти объём тетраэдра три стороны которого образованы векторами [latex]\overrightarrow{a}=(x_{a},y_{a},z_{a})[/latex], [latex]\overrightarrow{b}=(x_{b},y_{b},z_{b})[/latex], [latex]\overrightarrow{c}=(x_{c},y_{c},z_{c})[/latex]

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

Координаты векторов $a$, $b$, $c$.

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

Объём тетраэдра.

Решение

Объем тетраэдра вычисляется по формуле: [latex]V=\frac{1}{6}\left | \vec{a},\vec{b},\vec{c} \right |[/latex], где внутри модуля стоит смешанное произведение векторов.

Try Haxe!

Тесты

Входящие данные Результат
a b c V
7,10,12 11,20,9 5,12,10 110
3,6,3 1,3,-2 2,2,2 3
0,0,0 1,3,-2 2,2,2 0

ML26. Площадь треугольника

Условие
Найти площадь треугольника по заданным координатам его вершин $ A\left(x_a,y_a,z_a\right), B\left(x_b,y_b,z_b\right) $ и $ C\left(x_c,y_c,z_c\right) $.

Входные данные
Координаты вершин треугольника $ ABC $.

Выходные данные
Площадь $ S $ треугольника $ ABC $.

Тесты.

Входные данные Выходные данные
$ x_a $ $ y_a $ $ z_a $ $ x_b $ $ y_b $ $ z_b $ $ x_c $ $ y_c $ $ z_c $ $ S $
1 -2 1 2 3 -3 4 1 0 9 19.78635893740938
2 -3 13 -5 6 11 12 4 8 18 50.5618433208284
3 0 0 1 1 0 0 0 1 0 0.8660254037844389
4 0.5 0.5 1.5 1.5 0.5 0.5 0.5 1.5 0.5 0.8660254037844389

Решение.

Данную задачу можно решить, используя формулу Герона:
$ S = \sqrt{p \left(p — a\right) \left(p — b\right) \left(p — c\right)} $,
где $ a, b $ и $ c $ — длины сторон треугольника, а $ p $ — полупериметр, который вычисляется по формуле $ p = \frac{a + b + c}{2} $.
Для вычисления длины стороны треугольника используем формулу для определения расстояния между точками:
$ AB = \sqrt{\left(x_b — x_a\right)^2 + \left(y_b — y_a\right)^2 + \left(z_b — z_a\right)^2} $.

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

Ссылка на tryhaxe

e-olymp 125. Олимпиада

Ссылка на оригинальную статью.

Условие

Олимпиада началась в [latex]h_1[/latex] часов [latex]m_1[/latex] минут [latex]s_1[/latex] секунд, а закончилась в эти же календарные сутки в [latex]h_2[/latex] часов [latex]m_2[/latex] минут [latex]s_2[/latex] секунд. Сколько времени (час мин сек) проходила олимпиада?

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

В первой строке записано время начала, а во второй время окончания олимпиады в формате час мин сек.

[latex]0 \le h_1 \le h_2 \le 23[/latex], [latex]0 \le m_1, m_2 \le 59[/latex], [latex]0 \le s_1, s_2 \le 59[/latex].

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

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

Тестирование

Входные данные Выходные данные
1 9 30 0

12 45 30

3 15 30
2 9 30 30

12 45 0

3 14 30
3 9 45 0

12 30 30

2 45 30
4 9 45 30

12 30 0

2 44 30

Код

Решение

Очевидным решением задачи является вывод через пропуск разниц [latex]h_2 — h_1[/latex], [latex]m_2 — m_1[/latex] и [latex]s_2 — s_1[/latex]. Однако если часы, минуты или секунды конца олимпиады будут меньше соответствующих значений ее начала, то результат разницы разницы будет отрицательным. Чтобы этого избежать, существуют два if-блока, которые увеличивают количество секунд на [latex]60[/latex] и уменьшают количество минут на [latex]1[/latex], а так же выполняют аналогичные действия с минутами и часами в том случае, если входное количество минут или секунд начала олимпиады будут превышать соответственно минуты и секунды конца. После этого выводятся разницы, указанные в начале решения, которые теперь будут отображать реальную продолжительность олимпиады и гарантированно будут неотрицательными.