e-olymp 1611. Реверс подстроки

Задача

Дана строка $s$, в которой выделили подстроку, состоящую из символов с $i$-го по $j$-ый включительно (символы строки $s$ нумеруются с единицы) и поменяли местами $i$-ый символ с $j$-ым и так далее (конвертировали подстроку). Выведите строку $s$ после внесенных изменений.

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

В первой строке содержится строка $s$ длиной не более $1000$ символов, во второй — два числа $i$ и $j$ $\left ( i \leq j \right ).$

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

Выведите строку $s$ после внесенных изменений.

Тесты

Входные данные Выходные данные
$zbbg \\ 2 \ 3$ $zbbg$
$gaqipkajibk \\ 5 \ 6$ $gaqikpajibk$
$helloworld \\ 5 \ 7$ $helloworld$
$eolymp1611 \\ 7 \ 8$ $eolymp6111$

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

Решение

Для решения задачи вводим строку $str$ и преобразуем её в массив символов $(char)$. Далее в цикле конвертируем подстроку и выводим строку $s$ после внесенных изменений.

Ссылки

Условие задачи на e-olymp

Код решения задачи ideone

e-olymp 2807. Кубики — 3

Задача

Дома у Витека было [latex]2[/latex] одинаковых набора кубиков из английских букв, но во время очередной уборки один из кубиков затерялся. Помогите Витеку определить, какой же из кубиков отсутствует в одном из наборов.

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

В первой строке задано количество найденных Витеком кубиков [latex]n[/latex] [latex](1 \leqslant n \leqslant 105),[/latex] а во второй строке n символов, изображённых на каждом из кубиков

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

Выведите букву, изображённую на потерявшемся кубике, либо сообщение [latex]»Ok»,[/latex] если Витек ошибся и ни один из кубиков не потерялся.

Тесты

# Входные данные Выходные данные
1 5 abcac b
2 8 ryirhiyh Ok
3 3 AVA V
4 6 DjkjDk Ok
5 7 LnCsCnL s

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

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

Для того, чтобы решить задачу, мы проверяем четное ли количество кубиков, найденных Витеком. Воспользуемся оператором присваивания побитового исключающего ^= , с помощью которого мы будем сравнивать индексы символов, полученные из массива строки. Если количество кубиков четное, то переменная [latex]res[/latex] будет равна нулю, следовательно не один из кубиков не потерялся и мы увидим сообщение с текстом [latex] «Ok»[/latex]. Иначе выведится символ, который изображен на потерянном кубике.

Ссылки

Ссылка на e-olymp

Ссылка на ideone

e-olymp 1388. Заправки

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

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

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

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

Сначала идет количество городов n (1 ≤ n ≤ 100), затем идет n чисел, i-ое из которых задает стоимость бензина в i-ом городе (все числа целые из диапазона от 0 до 100). Затем идет количество дорог m в стране, далее идет описание самих дорог. Каждая дорога задается двумя числами — номерами городов, которые она соединяет. Все дороги двухсторонние (то есть по ним можно ездить как в одну, так и в другую сторону); между двумя городами всегда существует не более одной дороги; не существует дорог, ведущих из города в себя.

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

Выведите одно число — суммарную стоимость маршрута или -1, если добраться невозможно.

Тесты

Входные данные Выходные данные
1 4
1 10 2 15
4
1 2 1 3 4 2 4 3
3
2 4
1 10 2 15
0
-1
3 5
1 2 3 4 5
4
1 2 2 3 3 4 4 5
10

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

Описание

Оптимальную стоимость маршрута будем находить по алгоритму Дейкстры. Цены на бензин в i-ом городе хранятся в массиве price. Минимальные стоимости маршрутов к каждому из городов хранятся в массиве distance, изначально все маршруты принимаем бесконечно дорогими. Кроме того, для хранения информации о том, был ли рассмотрен i-й город, используется массив used. Сам граф представляется в виде списка смежности. Для этого используется массив векторов graph. Если в итоге стоимость маршрута до целевого города осталась бесконечной, значит, пути к нему не существует, и выводится -1. Иначе выводится эта стоимость.

Код на ideone.com.

Засчитанное решение на e-olymp.com.

Ю4.35

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

Совместная работа. Известно время $latex t_1,t_2,\cdots,t_n$, за которое некоторую работу может выполнить каждый из $latex n$ рабочих бригады, работая в одиночку. Сколько времени понадобится бригаде на выполнение этой работы, если они будут работать совместно (и при этом никто из них не «сачкует»)?

Тесты

Количество рабочих n. Время t каждого рабочего, требуемое для выполнения некоторой работы.  Время совместной работы.
3 5 7 9 2.2
4 7 9 11 23 2.6
4 1 2 3 4 0.5
5 3 1 5 2 3 0.4

 

Код

Описание решения

В данной задаче нам нужно найти время, за которое n рабочих выполнят какую-то совместную работу. В задаче не указан  общий объём выполняемой работы, по-этому зададим его как 1. Время совместной работы находят по формуле: $latex \frac{1}{\frac{1}{t_1}+\frac{1}{t_2}+\cdots+\frac{1}{t_n}}$.

В программе используем один цикл for в котором задаем значение переменной workingTime и суммируем объем выполняемой работы за час для каждого шага цикла (для каждого рабочего). После завершения цикла получаем объем работы выполняемой всеми работниками вместе за час. Делим общий объем работы на объем работы за час и получаем искомую величину.

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

e-olymp 111. Часы

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

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

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

Начальное и конечное время одних календарных суток в часах [latex](H)[/latex] и минутах [latex](M)[/latex] через пробел [latex](0 \leq H \leq 23, 0 \leq M \leq 59)[/latex].

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

Ответ на задачу — общее количество ударов.

Тесты

Входные данные Выходные данные
Начальное время Конечное время
1 00     00 02     35  18
2 17     23 22     29 45
3 16     57 16     57 0
4 00     00 23     59 180

Решение

Описание решения

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

Действия внутри цикла следует выполнять в следующем порядке:

  1. Увеличение количества ударов на 1 или на ту цифру (число), на которую указывает часовая стрелка
  2. Проверка равенства текущего времени и конечного.
  3. Увеличение времени на 1 минуту (переход на следующий час если текущая минута прошла отметку 59)

Такой порядок не позволит пропустить условие прерывания цикла или удара часов в различных случаях (например, начальное и конечное время равны, начальная минута равна 0 или 30).

В итоге к переменной rings будет прибавляться 1 каждый раз, когда минутная стрелка достигает 30 и число, на которое указывает часовая стрелка, каждый раз, когда минутная стрелка достигает 0 (находим остаток от деления количества часов на 12 за исключением тех случаев, когда часы показывают 12 или 0 часов rings += (h1==0 || h1==12)?12:h1%12;).

Посмотреть решение задания можно на сайте e-olymp.

Посмотреть, как работает программа со входными данными 00 00 23 59 можно на сайте ideone.