e-olymp 975. Флойд

Задача

Постановка задачи на e-olymp.

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

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

В первой строке содержится количество вершин графа [latex]n[/latex] [latex](1 \leq n \leq 100)[/latex]. В следующих [latex]n[/latex] строках находится по [latex]n[/latex] чисел, которые задают матрицу смежности графа. В ней -1 означает отсутствие ребра между вершинами, а любое неотрицательное число — присутствие ребра данного веса. На главной диагонали матрицы всегда расположены нули.

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

Вывести искомое максимальное кратчайшее расстояние.

Тесты

n matrix Результат
1 4 0   5   9   -1
-1   0   2   8
-1   -1   0   7
4   -1  -1   0
16
2 3 0   -1   2
2    0  -1
4    1   0
4
3 5 0  -1  -1  3  4
2  0  3  -1  4
-1  4  0  -1  4
3  -1  2  0  1
1  1  -1  -1  0
8

Ссылка на успешно пройденные тесты на сайте e-olymp.

Решение

Проверить работу кода можно в облаке по ссылке — Ideone.

Пояснения

Данная задача решается при использовании алгоритма Флойда-Уоршелла, суть которого состоит в нахождении длин кратчайших путей между всеми парами вершин во взвешенном ориентированном графе. Код данного алгоритма можно наблюдать в цикле по [latex]i[/latex], в котором имеются два вложенных цикла по [latex]j[/latex] и по [latex]k[/latex]. Здесь мы проходим по элементам матрицы смежности графа, проверяя существует ли ребро между вершинами. Далее следуя алгоритму Флойда выполняем следующее действие — с помощью функции Math.min()  находим минимальный путь из одной вершины в другую, записывая  его в матрицу. По нахождении всех кратчайших путей, находим максимальный из них, и выводим его в консоль.

Класс для хранения матриц

Задача

Напишите класс для хранения матриц и реализуйте основные операции работы с ними.

Тесты

Операция Входная матрица А Входная   матрица В Результат
 1 Транспони-рования 33 34 12
33 19 10
12 14 17
84 24 51
43 71 21
33 33 12 84 43
34 19 14 24 71
12 10 17 51 21
 2 Сложения -1   1   -1
1   -1   1
-1   1   -1
1   -1   1
-1    1  -1
1   -1   1
0   0   0
0   0   0
0   0   0
 3 Вычитания -1   1   -1
1   -1   1
-1   1   -1
1   -1   1
-1    1  -1
1   -1   1
-2   2   -2
2   -2   2
-2   2   -2
 4 Умножения 33  34  12
33  19  10
12  14  17
84  24  51
43  71  21
10  11  34  55
33  45  17  81
45  63  12  16
1992 2649 1844 4761
1407 1848 1565 3514
1347  1833 850 2066
3927 5217 3876 7380
3718 4991 2921 8452

Решение

Проверить работу кода можно в облаке по ссылке — Ideone.

Пояснения

Класс  Matrix  имеет следующие поля:  n, m  — размеры основной матрицы, и сама матрица  mainMatrix , представлена в виде двумерного массива целочисленного типа. Также данный класс имеет два конструктора: первый из которых принимает как параметры размеры создаваемой матрицы public Matrix(int n, int m) , второй же принимает как параметр двумерный массив(матрицу)  public Matrix(int [][] paramMatrix) .

Данный класс имеет следующие методы:

  1. public int getElement(int n, int m)  — метод для получения элемента матрицы по индексам;
  2. public void setElement(int n, int m, int value)  — метод задания элемента по индексам;
  3. public int getVerticalLength() — метод получения количества строк в матрице;
  4. public int getHorizontalLength()  — метод получения количества столбцов в матрице;
  5. public void fillRandomValues()  — метод заполнения матрицы рандомными значениями;
  6. public void displayMatrix()  — метод вывода матрицы;
  7. public static int[][] transpone(int[][] paramMatrix)  — метод транспонирования матрицы, с двумерным массивом как параметр;
  8. public static Matrix transpone(Matrix paramMatrix)  — метод транспонирования матрицы, с объектом класса  Matrix , как параметр;
  9. public static Matrix add(Matrix first, Matrix second)  — метод нахождения суммы двух матриц;
  10. public static Matrix subtract (Matrix first, Matrix second)  — метод вычитания одной матрицы из другой;
  11. public static Matrix multiply (Matrix first, Matrix second)  — метод произведения двух матриц.

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

АА14

Задача

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

Тесты

Входная строка Строка на выходе
 1 22.11.11 2211.11
 2 java.mazurok.com javamazurok.com
 3 Suspect The dot was not found.

Решение

Проверить работу кода можно в облаке по ссылке — Ideone.

Пояснения

Для редактирования строки  mainString , используем класс обертку  StringBuilder. Находим индекс первого вхождения точки в строке и записываем его в переменную  dotIndex , после чего выполняем проверку, нашла ли функция  indexOf()  точку в строке. Если нет, выводим соответствующее сообщение. Иначе же выполняем удаление символа из строки по индексу с помощью функции  deleteCharAt() и выводим результат в консоль.

А136в

Задача

Даны натуральное число [latex]n[/latex], действительные числа [latex]a_1,\ldots, a_n[/latex]. Вычислить: [latex]|a_1|+\ldots+|a_n|[/latex].

Тесты

     n [latex]a_1,\ldots, a_n[/latex] Результат
 1      3   3.31  -2.11   8.21     13.63
 2      6  -12.1  -2.56  9  5  -2  4     34.66
 3      2    -3.65  -3.11      6.76

Решение

Проверить работу кода можно в облаке по ссылке — Ideone.

Пояснения

С начала вводим количество элементов  [latex]n[/latex], после чего, в цикле по  i  от 1 до [latex]n[/latex] вводим элементы и суммируем их значение по модулю в переменную  sum , по выходу из цикла выводим сумму в консоль.

e-olymp 6122. Простой стек

Задача

Формулировка задания на e-olymp.

Реализуйте структуру данных «стек». Напишите программу, содержащую описание стека и моделирующую работу стека, реализовав все указанные здесь методы. Программа считывает последовательность команд и в зависимости от команды выполняет ту или иную операцию. После выполнения каждой команды программа должна вывести одну строчку. Возможные команды для программы:

  • push n — Добавить в стек число n (значение n задается после команды). Вывести ok.
  • pop — Удалить из стека последний элемент. Программа должна вывести его значение.
  • back — Вывести значение последнего элемента, не удаляя его из стека.
  • size — Вывести количество элементов в стеке.
  • clear — Очистить стек и вывести ok.
  • exit — Вывести bye и завершить работу.

Гарантируется, что набор входных команд удовлетворяет следующим требованиям: максимальное количество элементов в стеке в любой момент не превосходит 100, все команды pop и back корректны, то есть при их исполнении в стеке содержится хотя бы один элемент.

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

Каждая строка содержит одну команду.

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

Для каждой команды вывести в отдельной строке соответствующий результат.

Тесты

 Входные данные  Выходные данные
            push 2                             push 3                             push 5                              back                                 size                                   pop                                 size                                  push 7                             pop                                clear                                 size                                   exit                     ok                                       ok                                       ok                                        5                                        3                                        5                                        2                                       ok                                        7                                       ok                                        0                                      bye

Отмечу так же, что программа успешно прошла все тесты на сайте e-olymp со следующими результатами.

Решение

Проверить работу кода можно в облаке по ссылке — Ideone.

Пояснения

Структура класса Stack из себя представляет следующее:

  • Динамический массив   storage  типа  Vector<Integer> , который, по сути, и является хранилищем элементов стека;
  • Конструктор, в котором происходит инициализация вектора  storage ;
  • Метод  push(int number)  типа void , который принимает как параметр число, и заносит это число в стек;
  • Метод  pop()  типа  int , который возвращает значение верхнего элемента стека и извлекает его;
  • Метод  back()  типа  int , который возвращает значение верхнего элемента стека, без его извлечения;
  • Метод  size() , который возвращает количество элементов, находящихся в стеке;
  • Метод  clear() , который очищает стек;
  • Метод exit()  типа String , который возвращает строку «bye».

Ю 4.9

Задача

В матрице [latex]A(n, m) [/latex] все ненулевые элементы заменить обратными по величине и противоположными по знаку.

Тесты

      n        m  Входная матрица              Выходная матрица
     1                     3                         3           6   -2    -1                     0    0     4                    11   2    -3         -0.167     0.500      1.000                  0.000     0.000     -0.250                 -0.091    -0.500      0.333
     2                     3                         4       -3    -9    15   12        -31   -8     2     8           -1     2    -6    -8      0.333   0.111    -0.067   -0.083      0.032   0.125    -0.500   -0.125      1.000  -0.500     0.167    0.125
     3                    4                         3             1   1   1                       1   1   1                       1   1   1                       1   1   1            -1.000  -1.000   -1.000                    -1.000  -1.000   -1.000                    -1.000  -1.000   -1.000                    -1.000  -1.000   -1.000

Решение

Проверить работу кода можно в облаке по ссылке — Ideone.

Пояснения

Объявляем и инициализируем переменные n  и m , которые являются размерами нашей матрицы [latex]A[/latex]. Объявляем нашу матрицу и создаем экземпляр с размерами [latex]n[/latex] x [latex]m[/latex]. Далее создаем цикл по i  от 0 до [latex]n-1[/latex] в котором создаем вложенный цикл по  j  от 0 до [latex]m-1[/latex], и в нем поэлементно вводим значения матрицы. В следующем цикле снова создаем вложенный, в котором мы проходим по каждому элементу матрицы и проверяем не равен ли он нулю  if(A[i][j] != 0) . Если условие выполняется, то мы заменяем элемент на обратный и меняем знак. В последнем цикле выводим полученную матрицу, элементы которой будут выводится с точностью до трех символов после запятой.

А320. Вложенный цикл

Задача

Вычислить [latex] \sum\limits_{k = 1}^n (k^3 \sum\limits_{l = 1}^m (k-l)^2) [/latex] при произвольных целых [latex]n[/latex] и [latex]m[/latex].

Тесты

Тесты были подготовлены и проверены с помощью ресурса WolframAlpha.

 №      n      m      Результат
  1      3      2            144
  2      2      9           1332
  3      4      4           1120

Решение

Проверить работу кода можно в облаке по ссылке — Ideone.

Пояснения

Объявляем и инициализируем переменные n  и  m из потока ввода. Объявляем переменные для сумм:  m_sum для вложенного цикла по [latex]l[/latex] и  n_sum для цикла по [latex]k[/latex]. Далее создаем цикл по [latex]k[/latex] от 1 до [latex]n[/latex], в котором мы создаем вложенный цикл по [latex]l[/latex] от 1 до [latex]m[/latex], в котором вычисляем [latex]\sum\limits_{l=1}^m (k-l)^2[/latex] в переменную m_sum , по выходу из данного цикла добавляем произведение [latex] k^3 * \sum\limits_{l = 1}^m (k-l)^2 [/latex] в переменную  n_sum , после чего обнуляем переменную  m_sum . По выходу из цикла выводим финальную сумму в консоль.

А116г

Задача

Даны натуральное число [latex]n[/latex] и действительное число [latex]x[/latex]. Вычислить [latex]\prod\limits_{k = 1}^n (1+\frac{\sin(kx)}{k!})[/latex].

Тесты

 №      n       x         Произведение
  1      4    3.22                0.9673
  2     11   214.3                2.8177
  3      1      14                1.9906
  4      7    0.76                2.8456

Решение

Проверить работу кода можно в облаке по ссылке — Ideone.

Пояснения

Для вычисления данного в условии произведения кроме действительного  x  и натурального  n  введем такие переменные:  mult  — переменная произведения для вычисления в цикле,  fact  — переменная факториала [latex]k[/latex].

Инициализируем переменные  n  и  x значениями из потока ввода, после чего создаем цикл по [latex]k[/latex] от 1 до [latex]n[/latex], в котором будет вычисляться факториал и, собственно, само произведение. При вычислении произведения используем функцию sin()  стандартной библиотеки Math. По завершению цикла, выводим произведение с точностью до четырёх символов после запятой.

e-olymp 108. Среднее число

Задача

Дано три различных числа [latex]a[/latex], [latex]b[/latex], [latex]c[/latex]. Вывести среднее из них.

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

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

Числа  [latex]a[/latex], [latex]b[/latex], [latex]c[/latex] — целые и по модулю не превышают 1000.

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

Единственное число — ответ на задачу.

Тесты

 №         a         b          c     Результат
  1         5         7          9              7
  2         7         5          9              7
  3         9         7          5              7
  4         7         9          5              7
  5         5         9          7              7
  6         9         5          7              7

Решение

Проверить работу кода можно в облаке по ссылке — Ideone.

Пояснения

В первом условии  if((a > b && b > c)||(c > b && b > a)) , мы проверяем оба условия при которых при выполнении любого из них средним числом будет второе число. В следующем условии  else if ((b > a && a > c)||(c > a && a > b )) , проделываем точно такую же операцию, только уже с первым числом. Если же два предыдущих условных оператора не выполняются, то результат будет таков, что средним числом будет являться третье число.

ML2

Задача

Даны действительные числа [latex]x[/latex] и [latex]y[/latex]. Получить [latex]\frac{|x|-|y|}{|x|+|y|}[/latex].

Тесты

Входные данные Выходные данные
 1            3        7                 -0.4
 2           -5      -2              0.4285
 3           -6       4                  0.2
 4            2       -3                 -0.2

Решение

Проверить работу кода можно в облаке по ссылке — http://ideone.com/h12CNL

Пояснения 

Используя тип double объявляем переменные x, y и  solution. После, инициализируем переменные  x и  y значениями из потока ввода. Далее, находим решение нашего выражения при использовании метода  abs() библиотеки Math. Решение присваиваем ранее объявленной переменной solution, после чего выводим его в консоль.