e-olymp 9081. Автомобілі

Завдання

Троє водіїв вирішили опробувати нове шосе. Перший їхав зі сталою швидкістю $v_1$ км/год. протягом $t_1$ годин. Другий їхав зі сталою швидкістю $v_2$ км/год. протягом $t_2$ годин, третій – зі сталою швидкістю $v_3$ км/год. протягом $t_3$ годин. Хто з них проїхав найдовший шлях?

Вхідні дані

В одному рядку через пропуск ввести на стандартний пристрій введення значення $v_1$, $v_2$, $v_3$, $t_1$, $t_2$, $t_3$. Інтервал значень швидкостей – від $30$ до $100$ км/год. включно. Час у дорозі – з інтервалу $[1;15]$ годин.

Вихідні дані

Якщо найдовший шлях проїхав один водій, вивести на стандартний пристрій введення номер водія. Якщо найдовший шлях проїхали два або три водія, треба ввести в одному рядку через пропуск їх номери у порядку зростання.

Тести

Вхідні дані Вихідні дані
1. 38 9 54 5 62 3 1
2. 30 9 45 6 90 3 1 2 3
3. 30 15 45 5 50 9 1 3
4. 50 6 42 14 84 7 2 3

Код програми

Пояснення

Відповіддю до задачі є номери водіїв, що проїхали максимальну відстань. Для цього треба використати формулу, знайому всім ще зі школи: $S = Vt$. Після знаходження відстані пройденої кожним водієм, ми знаходимо максимальну серед них. Далі нам залишається тільки виводити у порядку зростання номери водіїв, які пройшли максимальну відстань.

Примітка: Швидкість і час вводяться попарно для кожного водія.

Посилання

Related Images:

e-olymp 49. Кот учёный

Задача

Уезжая из дома, поэт оставлял коту, прикованному к дубу цепью длиной $l$, $n$ рыбин. Зная координаты головы и хвоста каждой из них, подсчитайте, на какие сутки у кота визникнет чувство голода, если оно возникает тогда, когда за сутки он съест меньше, чем $k$ рыбин. Рыбину он может съесть, если сможет дотянуться хотя бы к одной её точке. Координаты дуба $(0, 0)$.

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

В первой строке находятся числа $l$, $n$, $k$. Далее идет $n$ строк: координаты головы $(x_{1i}, y_{1i})$ и хвоста $(x_{2i}, y_{2i})$ каждой рыбины. Все входные данные — целые числа, не превышающие по модулю $100$.

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

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

Тесты

Входные данные Выходные данные
[latex]4\, 4\, 2[/latex] [latex]2[/latex]
[latex]1\, 1\, -1\, 3[/latex]
[latex]2\, 2\, 4\, 2[/latex]
[latex]-3\, -4\, -3\, 4[/latex]
[latex]1\, -5\, 4\, -4[/latex]
[latex]3\, 2\, 1[/latex] [latex]3[/latex]
[latex]1\, 2\, 3\, 4[/latex]
[latex]1\, -1\, -1\, 1[/latex]
[latex]3\, 5\, 4[/latex] [latex]1[/latex]
[latex]2\, 4\, 5\, 7[/latex]
[latex]1\, -1\, -1\, 1[/latex]
[latex]8\, 10\, 2\, 7[/latex]
[latex]12\, 3\, 4\, 2[/latex]
[latex]100\, 100\, -100\, -100[/latex]

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

Решение задачи

Для каждой рыбы мы будем делать такой процесс.
Для начала проверим расстояния от начала координат до каждого из концов рыбы. Если хотя бы одно из них меньше либо равно длине цепи, то кот сможет съесть эту рыбу и ничего больше проверять не надо. Если же эти расстояния больше длины цепи поступим так. Найдем уравнение прямой проходящей через две точки (координаты начала и конца рыбы). Оно имеет вид: $$\frac{x-x_1}{x_2-x_1}=\frac{y-y_1}{y_2-y_1}$$ Приведем его к виду $ax+by+c=0$. Получим, что $a=y_2-y_1$, $b=-(x_2-x_1)$, $c=y_1(x_2-x_1)-x_1(y_2-y_1)$. Теперь проверим длину перпендикуляра к этой прямой от начала координат (т. к. если длина перпендикуляра больше длины цепи, кот точно не дотянется до рыбы). Расстояние $d$ от точки $(0,0)$ до прямой $ax+by+c=0$ посчитаем по формуле: $$d=\frac{a\cdot 0+b\cdot 0+c}{\sqrt{a^2+b^2}}$$ Избавляясь от корня и деления, получим условие: $$c^2\leq l^2(a^2+b^2)$$ (где $l$ — длина цепи). Если это условие выполняется, остается проверить, что точка пересечения перпендикуляра и прямой лежит между началом и концом рыбы (нам достаточно проверить по одной из координат, например по второй). Прямая, перпендикулярная исходной и проходящая через точку $(0,0)$, будет иметь вид: $$\frac{x}{a}=\frac{y}{b}$$ (т. к. $(a,b)$ — нормальный вектор к прямой, проходящей через начало и конец рыбы). Получаем систему из двух уравнений и двух неизвестных. Решая эту систему, получаем, что вторая координата точки пересечения равна: $$y=\frac{-cb}{a^2+b^2}$$ Теперь проверяем, лежит ли эта координата, между вторыми координатами начала и конца рыбы. Если да, то кот сможет съесть эту рыбу, иначе — нет.
Ответом на задачу будет $\left \lfloor\frac{count}{k}\right \rfloor+1$, где $count$ — количество рыб, до которых смог дотянуться кот, $k$ — минимальное количество рыб, которое кот должен съесть в сутки.

Ссылки

Условие задачи на e-olymp
Код решения

Related Images:

e-olymp 74. Паук и муха — 2

Задача

В пустой прямоугольной комнате длины [latex]А[/latex], ширины [latex]В[/latex] и высоты [latex]С[/latex] муха упала на пол и уснула. Паук, находящийся на одной из стен, или на полу, или на потолке, начал двигаться к ней по кратчайшему пути.

На какое расстояние он при этом переместится? Известно, что паук может передвигаться только по поверхности комнаты или же спускаться на паутине с потолка на пол, но только под прямым углом.

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

В первой строке заданы размеры комнаты [latex]A[/latex], [latex]B[/latex], [latex]C[/latex]. Во второй строке – координаты мухи на полу [latex]X1[/latex], [latex]Y1[/latex], [latex](0 ≤ X1 ≤ A[/latex], [latex]0 ≤ Y1 ≤ B)[/latex]. В третьей строке – координаты паука [latex]X2[/latex], [latex]Y2[/latex], [latex]Z2[/latex], [latex](0 ≤ X2 ≤ A[/latex], [latex]0 ≤ Y2 ≤ B[/latex], [latex]0 ≤ Z2 ≤ C)[/latex]. Все входные данные – целые не отрицательные числа, не превосходящие [latex]500[/latex].

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

Одно число – расстояние, на которое переместится паук, посчитанное с точностью до 2-х знаков после запятой.

Тесты

Входные данные Выходные данные
[latex]A[/latex] [latex]B[/latex] [latex]C[/latex] [latex]X1[/latex] [latex]Y1[/latex] [latex]X2[/latex] [latex]Y2[/latex] [latex]Z2[/latex] [latex]S[/latex]
[latex]4[/latex] [latex]7[/latex] [latex]3[/latex] [latex]2[/latex] [latex]1[/latex] [latex]3[/latex] [latex]7[/latex] [latex]2[/latex] [latex]8.06[/latex]
[latex]145[/latex] [latex]26[/latex] [latex]306[/latex] [latex]12[/latex] [latex]24[/latex] [latex]0[/latex] [latex]0[/latex] [latex]305[/latex] [latex]309.34[/latex]
[latex]26[/latex] [latex]18[/latex] [latex]53[/latex] [latex]24[/latex] [latex]15[/latex] [latex]24[/latex] [latex]1[/latex] [latex]53[/latex] [latex]58.52[/latex]
[latex]89[/latex] [latex]89[/latex] [latex]189[/latex] [latex]12[/latex] [latex]24[/latex] [latex]0[/latex] [latex]89[/latex] [latex]16[/latex] [latex]70.77[/latex]
[latex]18[/latex] [latex]26[/latex] [latex]145[/latex] [latex]14[/latex] [latex]2[/latex] [latex]17[/latex] [latex]26[/latex] [latex]141[/latex] [latex]147.14[/latex]

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

Решение задачи

Данная задача решается с помощью «разверток» комнаты: переход от трёхмерного пространства к двумерному.
Вид комнаты:

Рассмотрим такие случаи:

  1. Паук находится на полу ([latex]Z_2 = 0[/latex]);
  2. Паук находится на одной из стенок ([latex]X_2 = 0[/latex], или [latex]X_2 = A[/latex], или [latex]Y_2 = 0[/latex], или [latex]Y_2 = B[/latex] и [latex]Z_2 \neq 0[/latex]) либо на потолке ([latex]X_2 \neq 0[/latex], и [latex]X_2 \neq A[/latex], и [latex]Y_2 \neq 0[/latex], и [latex]Y_2 \neq B[/latex], и [latex]Z_2 = C[/latex]).

Первый случай тривиален и вычисляется по формуле [latex]\sqrt{(X_1 — X_2)^2 + (Y_1 — Y_2)^2}[/latex] с помощью функции [latex]distance[/latex].
В случае, когда паук сидит на стенке, мы можем построить 3 развертки:
Допустим, паук находится на левой боковой стенке ([latex]X_2 = 0[/latex]). Остальные случаи аналогичны этому.

  • Паук ползет по этой стенке, затем по полу. Тогда развертка будет такой:
  • Паук ползет через ближнюю к нам стенку и по полу. Тогда развертка следующая:
  • Аналогичен предыдущему случаю, только через дальнюю от нас стенку.

По этим разверткам мы можем вычислить координаты паука и кратчайшее расстояние от него до мухи с помощью функции [latex]distance[/latex]. Если же паук находится в одном из углов комнаты, то мы находим наименьшее расстояние из двух вариантов развертки.
Когда же паук сидит на потолке, не соприкасаясь ни с одной из стенок, у него есть 13 вариантов:

  • Паук спускается с потолка на паутине, затем ползет точно так же, как и в самом первом случае.
  • Паук ползет по потолку, по одной из стенок и по полу. Тогда развертка будет выглядеть следующим образом (потолок можно развернуть в 4 стороны — отсюда 4 случая):
  • Паук ползет по потолку, а затем по двум соседним стенкам и по полу. Таких случаев 8, поскольку порядок следования стенок, по которым тот ползет, также важен. Развертка одного из них:

По этим разверткам мы также можем вычислить координаты паука и кратчайшее расстояние от него до мухи с помощью функции [latex]distance[/latex].

Ссылки

Условие задачи на e-olymp
Задача Дьюдени о пауке и мухе
Код решения

Related Images:

Ю2.30. Расстояние между отрезками

Задача

Задача из сборника задач по программированию Юркина А.Г. 2002 г.
Найти расстояние между двумя между двумя произвольно заданными на плоскости отрезками [latex]AB[/latex] и [latex]CD[/latex].

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

Координаты концов первого отрезка [latex]A[/latex] [latex](x_a, y_a)[/latex], [latex]B[/latex] [latex](x_b, y_b)[/latex].
Координаты концов второго отрезка [latex]C[/latex] [latex](x_c, y_c)[/latex], [latex]D[/latex] [latex](x_d, y_d)[/latex].

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

Расстояние между отрезками [latex]min[/latex].

Тесты

 Входные данные  Выходные данные
 № [latex]x_a[/latex] [latex]y_a[/latex] [latex]x_b[/latex] [latex]y_b[/latex] [latex]x_c[/latex] [latex]y_c[/latex] [latex]x_d[/latex] [latex]y_d[/latex] [latex]min[/latex]
 1  1  1  2  1  3  1  4  1  1
 2  0  0  5  5  1  1  2  2  0
 3  0  1  3  3  5  3  6  4  2
 4  0  0  7  0  0  8  5  3  3
 5  5  5  10  10  5  9  6  12  2.8284
 6  2  1  3  5  0  0  0  5  2
 7  -3  0  3  0  0  -3  0  3  0

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

Решение

Для начала проверим не пересекаются ли отрезки. Пусть для отрезка [latex]AB[/latex] [latex]x=t(x_b-x_a)+x_a[/latex], [latex]y=t(y_b-y_a)+y_a[/latex], а для [latex]CD[/latex] [latex]x=s(x_d-x_c)+x_c[/latex], [latex]y=s(y_d-y_c)+y_c[/latex] (где [latex]0\le t\le 1[/latex], [latex]0\le s\le 1[/latex] ). Если отрезки пересекаются, то выполняются равенства: [latex]t(x_b-x_a)-s(x_d-x_c)=x_c-x_a[/latex] и [latex]t(y_b-y_a)-s(y_d-y_c)=y_c-y_a[/latex]. Полученную систему уравнений решим методом Крамера: 
[latex]\Delta =\begin{pmatrix} x_b-x_a & \quad x_c-x_d \\ y_b-y_a & \quad y_c-y_d \end{pmatrix}=(x_b-x_a)(y_c-y_d)-(y_b-y_a)(x_c-x_d)[/latex] [latex]\Delta _1=\begin{pmatrix} x_{ b }-x_{ a } & \quad x_{ c }-x_{ a } \\ y_{ b }-y_{ a } & \quad y_{ c }-y_{ a } \end{pmatrix}=(x_b-x_a)(y_c-y_a)-(y_b-y_a)(x_c-x_a)[/latex] [latex]\Delta _2=\begin{pmatrix} x_{ c }-x_{ a } & \quad x_{ c }-x_{ d } \\ y_{ c }-y_{ a } & \quad y_{ c }-y_{ d } \end{pmatrix}=(y_c-y_d)(x_c-x_a)-(x_c-x_d)(y_c-y_a)[/latex].
Тогда [latex]t=\frac { \Delta_1 }{ \Delta } [/latex], а [latex]s=\frac { \Delta_2 }{ \Delta } [/latex]. Если [latex]0\le t\le 1[/latex], [latex]0\le s\le 1[/latex], а [latex]\Delta \neq 0[/latex], то отрезки пересекаются и расстояние между ними [latex]min[/latex] равно [latex]0[/latex], иначе с каждого конца отрезка попытаемся опустить высоту на противоположный. Если отрезок, на который опускаем высоту вертикальный, то поменяем местами координаты каждого конца отрезка и точки, с которой опускаем высоту (таким образом сохраним расстояние между точкой и отрезком, а отрезок станет горизонтальным). Пусть [latex]k[/latex] и [latex]d[/latex] — коэффициенты уравнения прямой, на которую опущена эта высота. Основание высоты будет находится на прямой в точке  [latex]Z[/latex], координаты [latex]Z[/latex] [latex](x_z, y_z)[/latex] можно найти по формуле [latex]y_z=kx_z+d[/latex]. Поскольку высота перпендикулярна отрезку — скалярное произведение их векторов равно [latex]0[/latex]. Тогда [latex](x_2-x_1)(x_3-x_z)+(y_2-y_1)(y_3-y_z)=0[/latex], соответственно [latex]x_z=\frac { x_3x_2-x_3x_1+y_2y_3-y_1y_3+y_1d-y_2d }{ ky_2-ky_1+x_2-x_1 } [/latex] (где [latex](x_3, y_3)[/latex] — координаты точки, с которой была опущена высота, [latex](x_1, y_1)[/latex] и [latex](x_2, y_2)[/latex] — координаты концов отрезка, принадлежащего прямой на которую опущена высота). Вычислим длину [latex]dl[/latex] каждой высоты, основание которой принадлежит одному из данных отрезков: [latex]dl=\sqrt { {(x_3-x_z)}^{2}+{(y_3-x_zk-d)}^{2} }[/latex](где [latex] (x_3, y_3)[/latex] — координаты точки, с которой была опущена высота). Минимальная длина высоты и будет наименьшим расстоянием между отрезками. В случае, если невозможно опустить высоты из одного отрезка на другой: расстояние между ними будет равно минимальному расстоянию между концами двух отрезков [latex]min=\sqrt { {( x_1-x_3) }^{ 2 }+{ (y_1-y_3) }^{ 2 } }[/latex] (где [latex](x_1, y_1)[/latex] — координаты одного из концов первого отрезка, а [latex](x_3, y_3)[/latex] — координаты одного из концов второго отрезка) .

Ссылки

Related Images:

Ю 4.37

Задача

Автостоп-2. Из пункта А в пункт В, между которыми [latex]s[/latex] км, выехал велосипедист с постоянной скоростью [latex]v_{0}[/latex] км/ч. Навстречу ему — из пункта В — другой путешественник решил добраться «автостопом» — на разных видах попутного транспорта. Перед каждым участком он [latex]\tau _{i}[/latex] минут «голосует», ожидая попутного транспорта, затем движется [latex]t _{i}[/latex]  часов со скоростью [latex]v _{i}[/latex] км/час ( величины [latex]\tau _{i}, t _{i}, v _{i}, i=1,2,\ldots,n[/latex]  заданы в соответствующих массивах). Через какое время после старта и на каком расстоянии от пункта А путники встретятся?

Тесты

s [latex]v_{0}[/latex] n [latex]\tau _{i}[/latex] [latex]t _{i}[/latex] [latex]v _{i}[/latex] place, км  time, ч Комментарий
100.0 30.0  1 60.0 1.0 40.0 60.0 2.0 Пройден
100.0 10.0 1 0.0 1.0 40.0 Путники не доехали до места встречи Не пройден
130.0 15.0 2 0.0 3.0 1.0 2.6 40.0 33.3 2.587267 38.809006 Пройден

 

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

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

  1. Пока второй ждал — первый уже проехал весь путь.
  2. Если после i-ого этапа (т.е. после ожидания транспортного средства, поездки на нем) сумма пройденного пути второго и первого путника больше, чем весь путь.

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

Код на Java

 

Related Images:

Ю3.8

«Отскоки»

Задача: Материальная точка бросается на горизонтальную плоскость со скоростью [latex]V[/latex] и под углом [latex]\alpha[/latex] к ней ( плоскости ). При каждом ударе о плоскость, кинетическая энергия точи уменьшается в [latex]\beta[/latex] раз. Найти абсциссы первых [latex]n[/latex] точек касания. Сопротивлением воздуха пренебречь.

По умолчанию примем количество интересующих нас отскоков равным 3.

[latex]V[/latex](speed)[latex]m/c[/latex] [latex]\alpha[/latex](corner)  [latex]\beta[/latex] Первая координата Вторая координата Третья координата Комментарий
10 15 2 5.09858 7.64787 8.92252 Тест пройден
8 30 4 5.65184 7.06480 7.41804 Тест пройден
27 45 3 74.3373 99.1164 107.376 Тест пройден
17 35 3 27.6926 36.9234 40.0004 Тест пройден
13 0 5 0.00000 0.00000 0.00000 Тест пройден

Замечание:

По неизвестной мне причине (думаю на погрешность округления) [latex]sin( \pi)[/latex] при вычислениях равен 1.24879e-15.

Исходный код:

Для решения задачи необходимо вспомнить уроки физики в начале десятого класса, а именно главу о движении под углом к горизонту. Воспользуемся формулой расстояния полета материальной точки [latex]S=\frac{V^2sin(2\alpha) }{g}[/latex] . По условию задачи сказано, что кинетическая энергия уменьшается при каждом отскоке в [latex]\beta[/latex] раз. Если рассмотреть формулу кинетической энергии: [latex]E_{k}=\frac{ mV^2 }{2}[/latex]- можно заметить, что [latex] m[/latex] (масса) является константой, значит изменяться может только [latex]V^2[/latex] (скорость тела в квадрате). Если условится, что материальная точка начинает движение в начале координат, то координата первого отскока будет равна [latex]S[/latex], второй — [latex]S+S_{1}[/latex], третьей — [latex]S+S_{1}+S_{2}[/latex], n-ой — [latex]S+…+S_{n-1}[/latex].

Алгоритм:

  1. Объявление переменных и константы(ускорение свободного падения).
  2. Вывод поясняющей информации.
  3. Ввод значений переменных.
  4. Проверка недопустимых ситуаций:
    • Проверка угла: значения угла выше 90 градусов или отрицательное значение противоречат условию задачи.
    • Проверка скорости: отрицательное значение будет означать движение в противоположную интересующей нас сторону.
    • Проверка коэффициента уменьшения кинетической энергии: это число должно быть хотя бы положительным.
    • Проверка числа интересующих нас отскоков: это должно быть натуральное число.
  5. Вычисление вспомогательных величин (двойной угол, скорость в квадрате).
  6. Создание вычислительного цикла.
    • Вывод значений.
  7. Окончание работы.

 Ссылка на Ideone.

Related Images:

Ю 2.31

Задача

График движения путников к задаче Ю 2.31


График движения путников к задаче Ю2.31

Встреча. Из пункта А в пункт В выехал велосипедист со скоростью [latex]v_{0} [/latex] км/час. Одновременно навстречу ему из пункта В двинулся «автостопом» другой путник.[latex]s_{1} [/latex] м он двигался со скоростью [latex]v_{1} [/latex] м/час, [latex]s_{2} [/latex] м — со скоростью [latex]v_{0} [/latex] км/час, [latex]s_{3} [/latex] м — со скоростью [latex]v_{3} [/latex] км/час. Через сколько часов после старта и в какой точке путники встретились?

 Тесты

v0, км/час v1, м/час v3, км/час s1, м s2, м s3, м place, км time, час Комментарии
40 15000 10 20000 40000 40000 66.667 1.667 Пройден (встреча на первом промежутке)
10 5000 60 10000 60000 30000 55.0 5.5 Пройден (встреча на первом промежутке)
8 5000 30 10000 10000 80000 37.368 4.671 Пройден (встреча на первом промежутке)
-300 30000 23333 22222 5454 555.1 Неправильно введены данные Не пройден
10 2222 3333 0 -4444 11.6 Неправильно введены данные Не пройден

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

Можно предположить, что весь путь в задаче представлен суммой [latex]ss=s_{1}+s_{2}+s_{3}[/latex]. Для начала переведем все величины  в единицы СИ:

Из метров в километры:

[latex]s_{1}=s_{1}*0.001 \Leftrightarrow s_{1}=\frac{s_{1}}{1000}[/latex],

[latex]s_{2}=s_{2}*0.001 \Leftrightarrow s_{2}=\frac{s_{2}}{1000}[/latex],

[latex]s_{3}=s_{3}*0.001 \Leftrightarrow s_{3}=\frac{s_{3}}{1000}[/latex].

Из метров/час в километры/час: [latex]v_{1}=v_{1}*0.001 \Leftrightarrow v_{1}=\frac{v_{1}}{1000}[/latex]

Найдем место встречи. Тут может быть три случая:

  1. Встреча двух путников на первом промежутке пути. Тогда время встречи можно вычислить по формуле: [latex]time = \frac{ss}{( v_{0} + v_{1} )}[/latex] , а место встречи —  [latex]place = time * v_{0}[/latex]
  2. Встреча двух путников на втором промежутке пути: Тогда время встречи можно вычислить по формуле: [latex]time =\frac{ss — s_{1} — ( v_{0} * t_{1} ) }{ v_{0} + v_{0} }[/latex] , а место встречи — [latex]place = ( t_{1} + time ) * v_{0}[/latex].
  3. Встреча двух путников на третьем промежутке пути: Тогда время встречи можно вычислить по формуле: [latex]time = \frac{ ss — s_{1} — s_{2} — ( v_{0} * t_{2} )}{ v_{0}+ v_{3} }[/latex], а место встречи — [latex] place = ( t_{1}+t_{2} + time ) * v_{0}[/latex].

Если путники встречаются на первом промежутке пути, то их скорости суммируются (т.к. тела движутся на встречу друг к другу), при делении всего пути на сумму этих скоростей получим время встречи, расстояние можно найти умножив время встречи на скорость первого путника.

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

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

Код на Java

 

Related Images: