e-olymp 7029. Поликлиника

Задача

На прием к доктору каждый день приходит много людей. Каждый пациент находится на приеме целое число минут, однако разных пациентов доктор может принимать разное количество времени. Доктор начинает прием в момент времени $t_1$ минут и заканчивает прием в момент времени $t_2$ минут. Это означает, что любой пациент независимо от того, сколько времени его будет принимать доктор, может зайти на прием в моменты $t_1, t_1 + 1, …, t_2 − 1$. Заходить на прием к доктору в другое время или тогда, когда доктор принимает другого пациента, запрещено. Если пациент приходит в поликлинику в момент $t$, он ожидает первый момент времени $s ≥ t$ такой, что на этот момент доктор ведет прием, причем уже успел осмотреть всех пациентов, которые пришли в поликлинику раньше, то есть до момента $t$. Если доктор не успевает осмотреть всех до конца приема, то остаток пациентов должен прийти на следующий день.

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

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

В первой строке приведено три числа: количество желающих попасть на прием n, время начала приема $t_1$ и время завершения приема $t_2$, больший чем $t_1$.

Во второй строке перечислены $n$ чисел $a_1, a_2, …, a_n$ — время, когда в поликлинику зашли соответственно первый, второй, $…, n$-ый желающий попасть к доктору. Числа $a_1, a_2, …, a_n$ попарно различны и расположены в порядке возрастания.

В третьей строке перечислены n чисел $b_1, b_2, …, b_n$ — время, необходимое доктору на осмотр соответственно первого, второго, $…, n$-го пациента.

Все входные числа натуральные. Количество пациентов $n$ не больше $10^5$, остальные числа не превосходят $10^9$.

Сутки на планете, где проживает Петя Пяточкин, длятся значительно дольше, чем на Земле, поэтому время начала приема $t_1$, время завершения приема $t_2$, а также числа $a_1, a_2, …, a_n$ и $b_1, b_2, …, b_n$ могут быть большими чем 1440 — количество минут в земных сутках.

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

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

Тесты

Входные данные Выходные данные
1 3 10 20
7 14 18
5 2 1
17
2 5 10 20
4 9 12 16 22
4 10 10 9 2
9
3 1 10 20
5
15
5

Код

Решение

Создаём два массива, удовлетворяющих условия, a — время прихода пациентов и b — время на их приём. Инициализируем все необходимые переменные: t_1 и t_2 — время приёма, t — время в которое Петя должен прийти, n- кол-во пациентов, i и j — счётчики, l — время между приходом пациента и началом его приёма.

Проверяем приходит ли первый пациент в самое начало приёма или после начала приёма, если в начало приёма — то приходим тогда.

В цикле while определяем минимальное время, в которое Петя может прийти на приём к врачу. Проверяем приходит ли следующий пациент до завершения приёма предыдущего. Если приходит во время завершения, или через некоторое время, то заходим после приёма предыдущего. (Нам уступают) Если нет, цикл продолжается, проверяет, является ли разница между началом приёма следующего пациента и временем его прихода меньше, чем предыдущая зафиксированная разницы. Если да — записывает её и время прихода данного пациента, и переходит к следующему пациенту.       

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

Related Images:

e-olymp 972. Сортировка времени

Задача

Отсортируйте время согласно заданному критерию

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

Сначала задано число $n\, \left ( 1\leqslant n\leqslant 100 \right )$, а затем n моментов времени. Каждый момент времени задается 3 целыми числами — часы (от 0 до 23), минуты (от 0 до 60) и секунды (от 0 до 60)

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

Выведите моменты времени, упорядоченные в порядке неубывания (момент времени также выводится в виде трех чисел, ведущие нули выводить не нужно)

Тесты

Входные данные Выходные данные
1 [latex]\begin{matrix}
4 & & \\
10 &20 &30 \\
7 &30 &00 \\
23&59 &59 \\
13&30 &30
\end{matrix}[/latex]
[latex]\begin{matrix}
7 & 30 &00 \\
10&20 &30 \\
13&30 &30 \\
23& 59 & 59
\end{matrix}[/latex]
2 $\begin{matrix}
6\\
12 &55 &59 \\
8 &33 &34 \\
6 &56 &46 \\
10 &23 &52 \\
3 &20 &00 \\
19 &31 &0\\
10&23&52
\end{matrix}$
$\begin{matrix}
3 &20 &0 \\
6 &56 &46 \\
8 &33 &34 \\
10 &23 &52 \\
12 &55 &59 \\
19 &31 &0
\end{matrix}$

Решение

Создадим 4 массива где мы будем хранить время(отдельно часы, минуты, секунды), а также четвертый в котором мы будем хранить все время в одной удобной для нас единице измерения — секундах. Читаем поток ввода и переводим полученные данные, сравниваем их потом сортируем полученные результаты и выводим ответ.

Ссылки

e-olymp
ideone

Related Images:

e-olymp 3867. Ленивый Мишка

Задача. Ленивый Мишка

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

  • На мытье посуды уйдет [latex]t_1[/latex] секунд
  • Пропылесосить квартиру можно за [latex]t_2[/latex] секунд
  • Процесс игры с Маринкой займет [latex]t_3[/latex] секунд

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

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

Три целых числа [latex]t_1[/latex], [latex]t_2[/latex], [latex]t_3[/latex] ([latex]1 ≤ t_1, t_2, t_3 ≤ 1000[/latex]).

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

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

Тесты

Ввод Вывод
1 1 7 2 1
2 100 45 1 1
3 66 9 888 9
4 5 800 4 4
5 25 46 25 25
6 13 10 12 10
7 999 995 1000 995

Решение 1

Мишка выбирает мамино поручение, что занимает наименьшее количество времени. Нам дано время за которое Мишка выполнит данные поручения. Найдём из них наименьшее и выведем на экран. Воспользуемся функцией int min (int, int); из библиотеки cmath.

Код 1

Решение 2

Для нахождения минимума трёх чисел заведём переменную min и воспользуемся логическим ветвлением.

Код 2

Ссылки

Первое решение

Второе решение

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

Компиляция первого решения

Компиляция второго решения

Related Images:

e-olymp 1474. Сломанные часы

Задача

В электронных часах произошел сбой, и теперь каждую секунду увеличивается не счетчик секунд, а счетчик часов. При переполнении счетчика часов (то есть при достижении [latex]24[/latex]) он сбрасывается в [latex]0[/latex] и увеличивается счетчик минут. Аналогично, при переполнении счетчика минут происходит его сброс и увеличивается счетчик секунд. При переполнении счетчика секунд он также сбрасывается в [latex]0[/latex], а остальные счетчики так и остаются равными [latex]0[/latex]. Известно, что сбой произошел в [latex]h_1[/latex] часов [latex]m_1[/latex] минут [latex]s_1[/latex] секунд. В этот момент часы показывали правильное время.

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

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

В первой строке задаются три целых числа [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,\;h_2\;\lt\;24[/latex], [latex]0\;\le m_1,\;m_2,\;s_1,\;s_2\;\lt\;60[/latex] ).

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

В единственной строке выведите правильное время (т.е. число часов, минут и секунд) в момент, когда сломанные часы будут показывать [latex]h_2[/latex] часов [latex]m_2[/latex] минут [latex]s_2[/latex] секунд.

Тесты

Входные данные Выходные данные
[latex]12 \; 0 \; 0\\12 \; 1 \; 0[/latex] [latex]12 \; 0 \; 24[/latex]
[latex]13 \; 59 \; 59\\12 \; 59 \; 59[/latex] [latex]13 \; 59 \; 58[/latex]
[latex]15 \; 12 \; 16\\15 \; 12 \; 16[/latex] [latex]15 \; 12 \; 16[/latex]
[latex]\;0 \;\;\; 0 \;\;\; 0\\23 \; 59 \; 59[/latex] [latex]23 \; 59 \; 59[/latex]
[latex]16 \; 0 \; 17\\16 \; 0 \; 18[/latex] [latex]16 \; 24 \;17[/latex]
[latex]11 \;\; 0 \;\; 53\\0 \;\;\; 0 \;\;\; 0[/latex] [latex]13 \; 48 \; 42[/latex]
[latex]1 \;\; 13 \; 18\\22 \; 51 \; 32[/latex] [latex]7 \;\;\; 4 \;\;\; 51[/latex]

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

 

Решение

Учитывая особенности хода сломанных часов, подсчитаем количество секунд в начальный и конечный моменты времени ( sum1 и sum2). Вычислим, сколько секунд прошло с момента поломки часов — для этого найдём разность sum2 - sum1, прибавим [latex]86400[/latex] —  количество секунд в сутках (поскольку мог произойти переход через момент времени [latex]0 \; : \; 0 \; : \; 0[/latex]) и найдём остаток от деления полученной суммы на [latex]86400[/latex].

Теперь найдём количество секунд, прошедших с начала суток, в которых поломались часы ( time1). Прибавим к нему количество секунд, прошедших с момента поломки часов и найдём остаток от деления на [latex]86400[/latex] полученного числа. Имеем time2 — правильное время в секундах. Далее, находим значения счётчиков часов [latex]h_3[/latex], минут [latex]m_3[/latex] и секунд [latex]s_3[/latex] которые соответствуют моменту времени time2.

Ссылки

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

Related Images:

e-olymp 7366. Сколько до Нового Года?

Задача

У Деда Мороза есть часы, которые в секундах показывают сколько осталось до каждого Нового Года. Так как Дед Мороз уже человек в возрасте, то некоторые математические операции он быстро выполнять не в состоянии. Помогите Деду Морозу определить сколько полных дней, часов, минут и секунд осталось до следующего Нового Года, если известно сколько осталось секунд, т.е. разложите время в секундах на полное количество дней, часов, минут и секунд.

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

В единственной строке целое число [latex]N \left(0 < N ≤ 31500000\right)[/latex] – количество секунд, которые остались до наступления Нового Года.

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

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

Тесты

# Входные данные Выходные данные
1 5217656 60 9 20 56
2 7999 0 2 13 19
3 30123456 348 15 37 36
4 7841186 90 18 6 26
5 899650 10 9 54 10

Код

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

Вспомним, что:
1 сутки = 86400с;
1 час = 3600с;
1 минута = 60с.

Сперва рассчитаем кол-во полных суток в данном кол-ве секунд [latex]n[/latex]: [latex]\frac{n}{86400}[/latex].
Затем уберём кол-во секунд в полных сутках из исходного числа, а из оставшихся вычислим кол-во полных часов: [latex]\frac{n\bmod86400}{3600}[/latex].
Далее снова уберём кол-во секунд в полных часах и найдём кол-во полных минут: [latex]\frac{\left(n\bmod8640\right)\bmod3600}{60}[/latex].
Остаток от деления общего кол-ва секунд на 60 и будет искомым кол-вом секунд: [latex]n\bmod60[/latex].

Ссылки

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

Related Images:

e-olymp 111. Часы

Часы.

Постановка задачи

Часы с боем пробивают каждый час такое количество ударов, сколько их есть на циферблате с цифрами от 1 до 12, и по одному разу тогда, когда минутная стрелка указывает на цифру 6. Зная начальное и конечное время в рамках одних календарных суток (выраженное в часах и минутах), подсчитать общее количество ударов на этом промежутке времени.

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

Заведем переменную, которая будет отвечать за количество пробитых ударов. Если в начальное время минутная стрелка указывает на число 12, то увеличиваем значение нашей переменной на такое число, на которое указывает часовая стрелка, если же в начальное время минутная стрелка указывает на число 6, то увеличиваем значение переменной на 1. Увеличиваем начальное время на 1 минуту. Повторяем, пока начальное время не будет совпадать с конечным.

Тесты

Входные данные Выходные данные
Начальное время Конечное время Количество ударов
13:30 15:10 7
0:00 23:59 180
12:30 12:30 1
22:08 22:22 0

Реализация

ideone: ссылка
Засчитаное решение на e-olymp: ссылка

 

Related Images:

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

Ссылки

Условие задачи на E-Olymp;

Код программы на Ideone.com;

Подтверждение решения на E-Olymp.

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.6

Последовательная обработка деталей на трёх станках к задаче Ю3.6

Последовательная обработка деталей на трёх станках к задаче Ю3.6

Задача:  Время обработки. Каждая из деталей должна последовательно пройти обработку на каждом из 3-х станков. Продолжительности обработки каждой детали на каждом станке вводятся группами по 3 числа, до исчерпания ввода. Сколько времени займет обработка всех деталей?

Количество деталей Время обработки Ответ
3 1 2 3 4 5 6 7 8 9 29
2  4 5 6 -5 4 5 Ошибка
2 5 4 3 2 4 0 13

Решение:

Ссылка на ideone C++: http://ideone.com/sKN2FU

Ссылка на ideone Java: http://ideone.com/ZwNfNL

Введем 3 переменные  [latex]t1, t2, t3 [/latex] , обозначающие время обработки детали на каждом из 3х станков и переменные [latex]x, y, z [/latex] которые будут показывать общее время обработки на каждом станке. Дольше всех будет работать 3й станок, поэтому наша задача вычислить время обработки на нем всех деталей.

Вычисляем время обработки всех деталей:

Если у нас не было введено время обработки меньше нуля, то выводим общее время работы третьего станка.

 

Related Images:

А69

Задача:   Часовая стрелка образует угол [latex]\varphi[/latex] с лучом, проходящим через центр  и через точку, соответствующую  [latex]12[/latex]  часам на циферблате, [latex] 0 < \varphi \leq 2\pi[/latex]. Определить значение угла для минутной стрелки, а также количество часов и полных минут.

Тесты

[latex]\varphi[/latex] Часы Минуты [latex]\alpha[/latex] Комментарий
30 1 0.00 0.00 Пройден
360 12 0.00 0.00 Пройден
1 0 2.00 12.00 Пройден
149.9 4 59.8 358.80 Пройден

Код

 

В условии задачи сказано, что [latex] 0 < \varphi \leq 2\pi[/latex], значит вводимое значение угла [latex]\varphi[/latex] — не может быть отрицательным  и  быть больше 360 градусов. Угол [latex]\alpha[/latex] — угол между минутной стрелкой и лучом. Один час — 30 градусов, что бы узнать количество часов нам следует  поделить введенный угол [latex]\varphi[/latex] на 30 градусов. Но перед этим   важно узнать остаток от этого деления, если такой имеется.  Если остаток равен 0, значит минутная стрелка показывает 0 минут и можно смело вывести значения  часов ( поделив [latex]\varphi[/latex] на 30),  минут и угла [latex]\alpha[/latex]( 0 ). Если  остаток все же не равен 0, нужно отнять его от [latex]\varphi[/latex]   и разделить на 30 градусов.  Так-как в одном часе 60 минут, а остаток не может быть больше 30 градусов, умножаем его на 2 и получаем количество минут. Подобную операцию проводим над углом [latex]\alpha[/latex], но в этот раз умножаем на 12. Выводим значения часов, минут и угла [latex]\alpha[/latex].

Ссылка на Ideone

Код для Java

Ссылка на Ideone

Related Images:

А19

Задача: Определить время, через которое встретятся два тела, равноускоренно движущиеся навстречу друг другу, если известны их начальные скорости,ускорения и начальное расстояние между ними.

[latex]a_1[/latex] [latex]a_2[/latex] [latex]V_{01}[/latex] [latex]V_{02}[/latex] [latex]S[/latex] [latex] t[/latex] Комментарий
1 1 1 1 1 0.41 Пройден
3.2 2.1 3 7.5 20.8 1.45 Пройден
0 0 4 1 8 1.6 Пройден
В задаче нужно найти время,  через которое встретятся два тела, двигающихся равноускоренно, зная начальные скорости и ускорения этих тел, а также расстояние между ними.

Для решения этой задачи  использовались формулы:

[latex]S=V_0t+\frac{at^2}{2}[/latex]

Так как расстояние делится на две части, то получаем:

[latex]S=V_{01}t+\frac{a_1t^2}{2}[/latex],

[latex]S=S_0 — V_{02}t+\frac{a_2t^2}{2}[/latex]

Значит  [latex]S_0=V_{01}t+\frac{a_1t^2}{2}+V_{02}t+\frac{a_2t^2}{2}[/latex]. Получаем уравнение времени:

[latex]t^2(\frac{a_1+a_2}{2})+t(V_{01}+V_{02})-S_0=0[/latex]

Упрощаем коэффициенты  уравнения :

[latex]a=\frac{a_1+a_2}{2}[/latex],    [latex]b=V_{01}+V_{02}[/latex],    [latex]at^2+bt-S_0=0[/latex]

Если [latex]a=0[/latex],  находим корень уравнения  по формуле [latex]t=\frac{S_0}{b}[/latex]. Если же [latex]a[/latex] не равняется нулю, находим дискриминант по формуле [latex]D=b^2+4aS[/latex], дискриминант в данной задаче всегда положителен. Нет смысла находить время по формуле [latex]t=\frac{b^2-\sqrt{D}}{2a}[/latex], так как время не может быть отрицательным, остается использовать [latex]t=\frac{b^2+\sqrt{D}}{2a}[/latex] — это и будет искомое время.

Ссылка на Ideone

Код для Java

Ссылка на 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:

Ю1.4

Задача.

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

Тесты

Момент начала промежутка Момент конца промежутка Ответ
Часы Минуты Секунды Часы Минуты Секунды Часы Минуты Секунды
ch min sek ch1 min1 sek1 chh  minn sekk
3 24 30 10 44 35 7 20 5
2 11 20 10 21 10 8 9 50
2 10 31 10 10 44 8 0 13
2 11 30 10 6 20 7 54 50
2 11 20 10 6 30 7 55 10
3 4 4 3 4 4 Не прошло ни секунды с начала отсчета
0 30 11 0 44 15 0 14 4
0 11 70 0 15 80 Неправильно введены данные
0 0 30 0 0 55 0 0 25

 Код программы на C++:

В данной задаче я отнимал от конечного момента времени (часов, минут, секунд) начальный момент времени (часы, минуты, секунды) и получал результат. Особое внимание я уделил частным случаям. Здесь есть несколько основных условий при который обычного вычитания не достаточно, а требуются особые вычисление (т.к. в часах 60 минут, а в минутах 60 секунд).
Я разберу частный случай, при котором минуты и секунды конечного момента времени меньше минут и секунд начального момента времени.  Вот конкретная строка из кода, отвечающая за этот случай:
Разберем на конкретном примере. Начальный момент времени равен 2 часа 11 минут 30 секунд, а конечный — 10 часов 6 минут 20 секунд. (Строка 4 таблицы значений). Отнимая, 10-2=8, 6-11=-5, 20-30=-10, выходим за область значений и минуты с секундами получаются отрицательными. Для того, чтобы этого не случилось следует один час перевести в минуты и одну минуту перевести в секунды, то есть, соответственно, отнять единичку от конечных значений часов и минут. Получаем 9 часов 65 минут и 80 секунд. Это значение высчитывается в программе и является промежуточным вычислением, которое не выводится на экран, но участвует в расчетах. Отнимая, 9-2=7 , 65-11=54 , 80-30=50  , что уже и является результатом (7 часов 54 минуты 50 секунд). 
Остальные частные случаи вычисляются по такому же принципу (перевод одного часа в минуты / одной минуты в секунды).
Например, когда минуты начального момента времени и конечного момента времени будут равны, а секунды конечного момента времени меньше начального, то в ответе всегда получится 59 минут. (т.к. разность минут равна нулю, а одна минута нам нужна для того, чтобы оставить секунды в области допустимых значений, а 0 минут то же самое, что и 60 минут, а 60-1=59).
Второй вариант решения этой задачи выглядит намного проще. С теми же самыми тестами.

Код программы на C++:

Алгоритм:

  1. Переводим всё в наименьшие единицы измерения (в секунды). [latex]ch*=3600 [/latex], [latex]min*=60[/latex],[latex]ch1*=3600 [/latex], [latex]min1*=60[/latex]
  2. Находим начальное значение в секундах: [latex]beg=ch+min+sek [/latex], конечное значение в секундах [latex]end=ch1+min1+sek1[/latex].
  3. Находим разность между начальным и конечным значением, тем самым находим промежуток. [latex]dif=end-beg[/latex].
  4. Вычисляем значения часов,  минут и секунд промежутка по формулам: [latex]chh = \frac{dif}{3600}[/latex], [latex]minn = \frac{dif — 3600 * chh}{60}[/latex], [latex]sekk = dif — 3600 * chh — minn * 60[/latex].

Либо еще один вариант решения при помощи операций деления и остатка от деления.

Код программы на C++:

Алгоритм тот же кроме последнего пункта, где формулы становятся такими:
chh = dif / 3600,
minn = dif  % 3600 / 60,
sekk = dif  % 60.

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

И второе решение:

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

Код решения на Java

 

Related Images: