A1031

Задача. Получить все перестановки элементов 1, …, 6.

Решение

Все перестановки считаются и выводятся с помощью рекурсивной функции perestanovka().

Когда в ней складывается новый набор элементов, проверяем что бы в нем не было повторяющихся значений (считаем факториал и сумму, они должны совпадать со стандартом (6! = 720,  1+2+3+4+5+6 = 21) и тогда выводим.

Что бы убедиться, что выведено правильное количество перестановок, выводим в конце значение счетчика cnt (находится внутри функции perestanovka()) и требуемое значение перестановок ( 6! = 720). Эти значения совпадают.

А на Java решение выглядит так:

 

А717а

Задача

Две правые треугольные матрицы [latex]A[/latex] и [latex]B[/latex] порядка [latex]n[/latex] заданы в виде последовательности [latex]\frac{\left(n+1\right)*n}{2}[/latex] чисел: сначала идет [latex]n[/latex] элементов первой строки, затем [latex]n-1[/latex] элемент второй строки, начиная со второго элемента, и т. д. (из последней, [latex]n[/latex]-й строки берется только [latex]n[/latex]-й элемент).

Получить матрицу [latex]A*B[/latex].

Тесты

n матрица A матрица B результат (матрица A*B) комментарий
2 1 2

3

4 5

6

4 17

0 18

пройден
3 1 -1 2

4 6

6

1 -1 1

0 0

3

1 -1 7

0 0 15

0 0 18

пройден

Решение

Сначала обнуляем и вводим обе матрицы. Так как они заданы строкой чисел и известно, что они правые треугольные, заполняем ячейки массива, начиная от диагональных элементов.

Умножение выполнимо, потому что оба сомножителя — квадратные матрицы одного и того же порядка. Перемножаем матрицы стандартным способом (строки первой матрицы на столбцы второй).

Ссылка на код.

e-olimp 1098. Ходи ферзем!

Задача о восьми ферзях

Задача о восьми ферзях

Задача. На шахматной доске 8х8 произвольным образом расставлено ферзей, по одному на каждой вертикали, других фигур на доске нет. Ферзь может ходить на любое количество клеток как по диагонали, так и по вертикали или горизонтали, но при этом не может перепрыгивать через другие фигуры. Необходимо добиться такой позиции, в которой ни один ферзь не находится под боем любого другого, и сделать это за минимальное количество ходов.

Входные данные. В одной строке задано сначала натуральное число T (T < 6) — количество тестов. Далее через пробел задано T блоков по 8 целых чисел от 1 до 8 – номера горизонталей, на которых находится ферзь с i-той вертикали. Вертикали пронумерованы подряд.

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

Тесты

Входные данные Выходные данные Комментарий
2 1 1 1 1 1 1 1 1 2 4 6 8 3 2 7 5 71 пройден

Решение

«Поиск с возвратом» в задаче о восьми ферзях.
Алгоритм.
При решении задачи используется два массива : массив расстановок из теста и массив правильной расстановки. Первоначально массив правильных расстановок — пустой (все значения элементов массива = -1).

Для вычисления правильных расстановок вызывается рекурсивная функция line_up (параметром которого является номер столбца). Внутри функции line_up вызывается функция check (параметр — номер столбца), она проверяет горизонтальную линию и две диагонали на поля, которые бьет ферзь. Элементам массива правильных расстановок присваиваются номера горизонтальных линий (алгоритм «Поиск с возвратом»).

Как только достигается одна из возможных правильных расстановок вызывается функция calc_min_strok(). Если элемент одного массива не равен элементу другого — это ход. Функция calc_min_strok() вычисляет количество ходов для данной расстановки и решает минимальное оно или нет для данного теста.

Решение на Java:

(Что бы прошло на e-olimp нужно удалить все комментарии)

 

e-olimp 5075

Задача Ориентированный граф задан списком ребер. Найдите степени всех вершин графа.
Входные данные. Входной файл содержит числа [latex]n[/latex]  [latex]\left(1\leq n\leq 100\right)[/latex] — число вершин в графе и [latex]m[/latex] [latex]\left(1\leq m\leq n*\left(n-1\right)\right)[/latex] — число ребер. Затем следует [latex]m[/latex] пар чисел — ребра графа.

Выходные данные. Выведите в выходной файл [latex]n[/latex] пар чисел — для каждой вершины сначала выведите полустепень захода и затем полустепень исхода.

Тесты

Тесты Результат Комментарии
4 41 21 3

2 3

3 4

0 21 12 1

1 0

пройден
4 1
3 2
0 01 00 1

0 0

пройден

Решение

Решение на Java:

 

 

АА24

Задача

 Ввести строку S и целое положительное число N, а также символы C1 и С2. Заменить каждое вхождение символа C1 на N символов C2.

Тесты

Данная строка C1 C2 n Получаемая строка Комментарий
a111a111 a = 3 ===111===111 пройден
omnomnom n  1 om-om-om пройден
Nina N Z 1 Zina пройден

Решение

 Мы идем по данной строке, если попадаем на символ, который не нужно заменять (не С1), то просто переписываем его в новую строку, если попадаем на символ С1, записываем в созданную новую строку n символов С2.

Код на Java:

 

Ю12.13

Задача

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

Тесты:

Текст Результат Комментарий
SOS  …—…  пройден
 A true SOS !!!  .- -…- — .-. ..- . -…- … — … -…- —..— —..— —..— -…-  пройден

 

Код:

Я создала ассоциативный  массив  через map, и связала буквы («ключ«) и соответствующие им значения в азбуке Морзе («значение«). Чтобы не заполнять его еще и большими буквами, во вводимом тексте уменьшаю буквы с помощью функции tolower .  

Решение через c-string :

Ссылки:

string

c-string.

Решение на Java:

 

А412а

Задача

Даны две целочисленные квадратные матрицы порядка 6. Найти последовательность из нулей и единиц [latex]b_{1},\ldots,b_{6}[/latex] такую, что [latex]b_{i}=1[/latex] , когда все элементы [latex]i[/latex]-строки первой матрицы больше соответствующих элементов [latex]i[/latex]-строки второй матрицы.

Тесты

матрица 1 матрица 2 строка комментарий
2   4  5  6  7  0

5   6  7  3  0  2

-7 9 -5 90 32 11

45  7  -1  3 4  7

2   2   2   2  2  2

5  7  5   8   3  1

1   3 -5  -6  4 -4

2   5  9  4  1  3

7 6 -2 0 56 19

5  6  -2  1 3  0

1  1  1  1  1  1

2    4   7   2  0  1

100110 пройден
9 8 7 6 7 8

2 3 4 5 6 7

1 9 6 0 3 5

5 8 -2 3 4 5

9 7 6 5 4 3

7 6 4 3 2 6

9 8 7 6 7 8

1 2 2 2 2 2

1 9 6 0 3 5

0 0 -4 0 0 0

9 7 6 5 4 3

1 1 1 1 1 1

010101 пройден

Код

Ссылка на код.

Код на Java:

 

Ю3.42

Задача

Расписание звонков. В учебном заведении задается начало учебного дня,  продолжительность «пары» или урока, продолжительность обычного и большого перерывов (и их «место» в расписании), количество пар(уроков). Получить расписание звонков на весь учебный день.
Задаем начальные значения в теле программы.
Начало урока — 8:45
Продолжительность обычной перерыва — 30 минут.
Продолжительность большого перерыва — 45 минут.
Место в расписании и количество уроков задается в массиве time_table .
Результат:

Решение:

Используется структура tm для хранения времени.

Ссылка на код.

Решение на Java:

 

Ю4.31

Задача

Циклический сдвиг. Осуществить циклический сдвиг элементов массива [latex]T\left(n\right)[/latex] на  [latex]m[/latex] позиций влево, то есть получить массив: [latex]t_{m+1},\ldots t_{n}, t_{1},\ldots t_{m}[/latex].
ри этом необязательно [latex]m<n[/latex].

Тесты:

изначальный массив сдвиг (m) результат комментарий
1 2 3 4 5 6 7 2 3 4 5 6 7 1 2 пройден
1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 пройден
1 2 3 4 5 6 7 10 4 5 6 7 1 2 3 пройден

 

 

Ссылка на код.

Код на Java:

 

 

А165ж

Задача

Даны действительные числа  [latex]a_{1},a_{2}[/latex] … Известно, что  [latex]a_{1}>0[/latex]  и что среди [latex]a_{2}, a_{3}[/latex]  … есть хотя бы одно отрицательное число. Пусть  [latex]a_{1},\ldots,a_{n}[/latex]  — члены данной последовательности, предшествующие первому отрицательному члену ( [latex]n[/latex]   заранее неизвестно). Получить:

[latex]a_{1}a_{2}+a_{2}a_{3}+\ldots+a_{n-1}a_{n}+a_{n}a_{1}[/latex]  .

Тесты:

Введенные числа Результат Комментарий
2 3 4 -5 26 пройден
6 0 45 3 -1 153 пройден
1 -223 1 пройден

Решение:

Программа считает по формуле (данной в условии) все введенные положительные числа, пока не встретится отрицательное число.

Ссылка на код.

А на Java решение выглядит так:

 

 

Ю3.2

Задача: Периодические функции. Утверждается, что функция [latex]y = f\left ( x \right)[/latex] периодическая с периодом  [latex]T[/latex]. Проверить это численно, вычислив функцию с постоянным шагом на отрезке [latex]\left [ 0,5T \right ][/latex]. Учесть погрешность вычислений и возможные точки разрыва функции. Проверить на примере функций:
[latex]y=\sin^{2}x[/latex],     [latex]y=\tan x[/latex]           [latex]\left (T=\pi\right)[/latex];
[latex]y=\frac{1}{x}\cdot \sin x[/latex]              [latex]\left (T=2\pi\right)[/latex]

Continue reading

А35а

Задача

Даны действительные числа [latex]x,y,z[/latex] . Вычислить [latex]max\left ( x+y+z,xyz \right )[/latex].

x y z Результат Комментарий
2 5 6 60 пройден
2 2 1 5 пройден
0 1 125 126 пройден
-23 56 7 40 пройден

 

Код:

Поиск максимального из двух чисел [latex]a=x+y+z[/latex] и [latex]b=x\cdot y\cdot z[/latex]

(Если числа одинаковые, то выведется второе, но на результат это не влияет. )

А на Java решение выглядит так:

 

 

Ссылка на код.

Ю2.19

Задача

   Привал.

Путник двигался   [latex]t_{1}[/latex]   часов со скоростью   [latex]v_{1}[/latex]  , затем  [latex]t_{2}[/latex]   часов — со скоростью  [latex]v_{2}[/latex]  и  [latex]t_{3}[/latex]  часов — со скоростью   [latex]v_{3}[/latex] .

За какое время он одолел первую половину пути, после чего запланировал привал?

[latex]t_{1}[/latex] [latex]t_{2}[/latex] [latex]t_{3}[/latex]  [latex]v_{1}[/latex]  [latex]v_{2}[/latex] [latex]v_{3}[/latex] Результат Комментарии
2 3 4 90 80 30 3.125 пройдено
9 85 3 450 230 20 42.826 пройдено
 4.5 75.9 3.124 100 0  0  2.25 продено

 

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

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

Расстояние и время вычисляется по формулам:

[latex]s=t\cdot v[/latex]

 

[latex]t=\frac{s}{v}[/latex]

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

 

Ссылка на код здесь.

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

ссылка на  код 

Решение на Java:

 

 

Ю1.11

Задача

     Комплексное число. Заданы действительная и мнимая части комплексного числа     [latex]z=x+\imath \cdot y[/latex] .  Преобразовать его в тригонометрическую форму и напечатать в виде выражения:

[latex]z=r\cdot\left(\cos\varphi+\sin \varphi\right)[/latex] .

     Для справки:    [latex]r=\sqrt{x^{2}+y^{2}}[/latex] ;      [latex]\varphi= \text{arctg} \left(\frac{y}{x}\right)[/latex]  .

x

y

Результат

Комментарий

4

2

z = 4.47214 * (cos(0.463648) + i *sin(0.463648))

пройден

1

0

z = 1 * (cos(0) + i * sin(0))

пройден

-1

-2

z = 2.23607 * (cos(-2.03444) + i * sin(-2.03444))

пройден

0

0

no answer

пройден;

(x стоит в знаменателе и не может быть нолем)

-100

356

z = 369.778 * (cos(1.84464) + i * sin(1.84464))

пройден

1,2

5,4

  z = 5.53173 *(cos(1.35213) + i*sin(1.35213))

пройден

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

 

В условии задачи даны все нужные формулы.

Программа вычисляет r (радиус [latex]r[/latex]) и f (угол [latex]\varphi[/latex] ) и выводит их, вставляя в формулу геометрической формы комплексного числа  (которая не меняется).

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

Решение на Java: