e-olymp 107. Компакт-диски

Чистые компакт-диски продают в трёх видах упаковок. Упаковка из 100 дисков стоит 100 грн., из 20 дисков — 30 грн., а один диск стоит 2грн. Какую минимальную сумму нужно истратить для покупки [latex]N[/latex] таких дисков?

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

Единственное число [latex]N[/latex] — количество дисков. Значение [latex]N[/latex] натуральное, не больше 1000.

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

Искомая минимальная сумма в гривнах.

Тесты

Вход Выход
123 136
 130  150
 140  160
 23  36
 132  154
 170  200
 148  176

Код

Решение

Пусть задано число N — количество дисков и цена N таких дисков. Используем if-блок, для того, чтобы вычислить минимальную сумму дисков. Присваиваем 100 дискам целочисленные значения N. Увеличиваем цену 100 дисков. Вводим а — упаковка из 20 дисков. Присваиваем числу а целочисленные значения N. С помощью if-блока увеличиваем цену 20-ти дисков. Вводим b — один диск. Увеличиваем цену одного диска.

Решение принято на сайте e-olymp.com.

Выполнить код программы можно здесь.

Related Images:

А412в

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

в)[latex]i[/latex]-e строки первой и второй матриц содержат вместе не более трех положительных элементов;

Первая матрица Вторая матрица [latex]b_{1},\ldots,b_{6}[/latex]
2 4 5 -1 -2 -3
-1 -2 -3 1 -3 -2
2 4 5 -1 -2 -3
2 4 5 -1 -2 -3
-1 -2 -3 1 -3 -2
2 4 5 -1 -2 -3
2 4 5 -1 -2 -3
-1 -2 -3 1 -3 -2
2 4 5 -1 -2 -3
2 4 5 -1 -2 -3
-1 -2 -3 1 -3 -2
2 4 5 -1 -2 -3
010010
8 5 -2 -4 -2 -1
-1 -2 0 1 0 2
11 -4 6 0 0 -3
1 3 -5 0 2 -3
-11 0 -3 1 -3 -2
1 -4 4 0 0 0
0 0 0 0 0 0
-7 -4 -5 1 -4 -2
2 -4 0 -1 -2 -3
3 1 -5 9 -6 -7
-1 -2 -3 0 -3 2
2 4 5 5 7 8
111010

 

Вводим две матрицы 6×6. Создаем одномерный массив с шестью элементами. В цикле просматриваем одновременно обе строки каждого массива и если находим положительный элемент то увеличиваем счетчик на один. Проверяем значение счетчика, если оно меньше трех, то в одномерный массив записываем 1, если больше, то 0.

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

 

Ideone.

Related Images:

А60д

Задача.

Пусть D — заштрихованная часть плоскости и пусть u определяется по и y следующим образом :

[latex]u=\begin{cases} \sqrt{|x^{2}-1|} & \text{ if } (x, y)\epsilon D \\ x+y & \end{cases}[/latex]

Даны действительные числа x и y. Определить u.
1

Тесты.

Ввод Вывод
x y u
0 0 1
0 0.5 1
-0.3 0.6 0.953939
0.3 0.6 0.953939
-0.2 -0.1 -0.3
0.8 0.6 1.4
0.5 -0.5 0

 

 

 

Решение.

Через переменные x, y обозначим координаты точки.

Мы имеем 3 графика функций:

  1. [latex]y=-x[/latex]
  2. [latex]y=x[/latex]
  3. [latex]x^{2}+y^{2}=1[/latex]

 

Проверяем находится ли точка в заштрихованной области. Точка обязательно должна находиться над или на оси x. 

Если точка принадлежит данной области то для расчёта используем формулу:

[latex]\sqrt{|x^{2}-1|}[/latex]

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

[latex]u=x+y[/latex]

 

Related Images:

Ragnarök — Power of Thor

 Рагнарёк

Задача

Есть Тор. А у Тора был источник силы. Больше нет. Тор движется по прямоугольному полю и ему известны его координаты и координаты источника. Наша задача: за наименьшее количество ходов привести Тора к источнику. Допустимые варианты движения приведены на картинке ниже:

Рагнарёк-2

Инициализация

Одна строка, в которой даны четыре целых числа:  LX, LY, TX, TY — соответственно абсцисса и ордината источника, абсцисса и ордината начального положения Тора.

Инициализация

Одна строка, в которой даны четыре целых числа:  LX, LY, TX, TY — соответственно абсцисса и ордината источника, абсцисса и ордината начального положения Тора.

Входные данные для одного игрового хода

Уровень энергии Тора. Нам он не понадобится.

Выходные данные для одного игрового хода

Одна из следующих строк: «N», «NE», «E», «SE», «S», «SW», «W», «NW», указывающая в каком направлении Тору нужно переместиться.

Решение

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

Во-первых, нужно учесть, что ордината растёт в южном, а не в северном направлении, как обычно:

 Рагнарёк-3

Во-вторых, если бы поле не было прямоугольным (или на нём были бы преграды, не позволяющие двигаться в том или ином направлении), то наш метод пришлось бы серьёзно модифицировать.

 

Код на С++

Код на Java

 

Related Images:

А37

Задача: Даны  действительные числа [latex]a, b, c[/latex]. Удвоить эти числа, если  [latex] a \geq b \geq c[/latex], и заменить их абсолютными значениями, если  это не так.

[latex]a[/latex] [latex]b[/latex] [latex]c[/latex] [latex]a_1[/latex] [latex]b_1[/latex] [latex]c_1[/latex] Комментарий
 26  16        -2          52.00        32.00         -4.00 Пройден
 20  30         0          20.00        30.00           0 Пройден
 -4  -16        -20         -8.00       -32.00         -40.00 Пройден
 2.75  3.56        -1          2.75        3.56           1 Пройден
 2   2         2           4.00        4.00          4.00 Пройден
В задача нужно проделать на введенными числами операции в зависимости от соблюдения неравенств. Если [latex] a \geq b \geq c[/latex], то мы удваиваем все введенные числа. Если же, неравенство [latex] a \geq b \geq c[/latex] не соблюдается, то находим модули каждого из чисел([latex]|a|, |b|, |c| [/latex] ) и выводим полученное как результат.

Ссылка на Ideone.

Код Java

Ссылка на Ideone

Related Images:

Ю2.21

Задача: Имеются три раствора полезного вещества с концентрациями [latex]p_{1}, p_{2}, p_{3}[/latex] каждый и стоимостью [latex]s_{1}, s_{2}, s_{3}[/latex] соответственно. Можно ли смешать их так, чтобы получить раствор с заданной концентрацией [latex]p[/latex] наименьшей стоимости [latex]s[/latex]?
Указание. Пусть [latex]\alpha_{1}, \alpha_{2}, \alpha_{3}[/latex]- долевые содержания растворов в смеси. Тогда для получения заданной концентрации [latex]p[/latex] необходимо [latex]p_{1}\alpha_{1} + p_{2}\alpha_{2} + p_{3}\alpha_{3}=p[/latex].
Кроме того, нужно учесть условие «комплектности смеси»: [latex]\alpha_{1} + \alpha_{2} + \alpha_{3} = 1[/latex]; [latex]\alpha_{1} \ge 0; \alpha_{2} \ge 0; \alpha_{3} \ge 0;[/latex] При этих условиях необходимо найти наименьшее значение линейной функции: [latex]s = \min _{ \alpha_{1}, \alpha_{2}, \alpha_{3} } { ( s_{1} \alpha_{2} + s_{2} \alpha_{2} + s_{3} \alpha_{3} ) }[/latex].
С учётом ограничений задача сводится к минимизации линейной функции одного переменного на отрезке, однако искомые выражения и условия получаются достаточно громоздкими. Можно показать, что в решении будут участвовать не более двух растворов. Тогда достаточно среди вариантов:
а) [latex]\alpha_{1} = 0[/latex];
б) [latex]\alpha_{2} = 0[/latex];
в) [latex]\alpha_{3} = 0[/latex];
Выбрать оптимальный, и затем провести необходимые расчеты.
Тесты

1 2 3 p s Комментарий
[latex]p_{i}[/latex] 0 0 0 0 10 Пройден
[latex]s_{i}[/latex] 10 12 14
[latex]p_{i}[/latex] 0 10 30 0 10 Пройден
[latex]s_{i}[/latex] 10 20 30
[latex]p_{i}[/latex] 15.3 49.2 51.6 37.4 29.56 Пройден
[latex]s_{i}[/latex] 40 10 20
[latex]p_{i}[/latex] 30 30 30 40 Impossible Пройден
[latex]s_{i}[/latex] 25 14 40
[latex]p_{i}[/latex] 20.3 20.3 20.3 20.3 30 Пройден
[latex]s_{i}[/latex] 30 40 50
[latex]p_{i}[/latex] 30 40 50 20 Impossible Пройден
[latex]s_{i}[/latex] 19 31 22
[latex]p_{i}[/latex] 20 60 80 40 40 Пройден
[latex]s_{i}[/latex] 60 20 100
[latex]p_{i}[/latex] 20 50 90 50 15.71 Пройден
[latex]s_{i}[/latex] 10 80 20
[latex]p_{i}[/latex] 10 60 90 62.5 62.5 Пройден
[latex]s_{i}[/latex] 190 10 20

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

Метод решения:
Задача сводится к решению системы уравнений:
[latex]\begin{cases} p_{1} \alpha_{2} + p_{2} \alpha_{2} + p_{3} \alpha_{3} = p,\\ \alpha_{1} + \alpha_{2} + \alpha_{3} = 1,\\ s = \min _{ \alpha_{1}, \alpha_{2}, \alpha_{3} } { ( s_{1} \alpha_{2} + s_{2} \alpha_{2} + s_{3} \alpha_{3} ) }; \end{cases}[/latex]

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

Аналитическое решение в данном случае тривиально:
[latex]\begin{cases} p_{i} \alpha_{i} + p_{j} \alpha_{j} = p,\\ \alpha_{i} + \alpha_{j} = 1; \end{cases} \Rightarrow \begin{cases} \alpha_{i} = \frac { p-p_{i} } { p_{j}-p_{i} },\\ \alpha_{j} = 1-\alpha_{i}; \end{cases} s = s_{i} \alpha_{i} + s_{j} \alpha_{j};[/latex]

Для большей наглядности применяется функция c_price (calculate price), в теле которой рассмотрены крайние случаи:
1) Если [latex]p_{1}=p_{2}=p[/latex], то нужно выбрать раствор наименьшей стоимости.
2) Если [latex]p_{1}=p_{2} \ne p[/latex], то решений нет.
3) Если [latex]p_{1}=p \ne p_{2}[/latex], то [latex]s = s_{1}[/latex]. Аналогично в случае [latex]p_{2}=p \ne p_{1}[/latex].
4) Если доля раствора в смеси [latex]\alpha 1[/latex], то решений нет.

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

Протестировать работу программы можно по ссылке.
Реализация на Java: http://ideone.com/qTQpMX

Related Images:

А47

Задача:
Даны действительные положительные числа [latex]x[/latex], [latex]y[/latex], [latex]z[/latex].
а) Выяснить существует ли треугольник с длинами сторон [latex]x[/latex], [latex]y[/latex], [latex]z[/latex].
б) Если треугольник существует, то ответить — является ли он остроугольным?

NA — «not acute» — существует, но не остроугольный
A — «acute» — остроугольный
DE — «doesn’t exist» — не существует

[latex]x[/latex] [latex]y[/latex] [latex]z[/latex] Результат Комментарий:
3 4 5 NA Пройден: трегольник прямоугольный
1.30 3.86 5.14 NA Пройден
1.67 2.29 8 NE Пройден: нарушено условие (I)
811 22 790 NA Пройден: треугольник тупоугольный
10 11 12 A Пройден

Алгоритм:
I. Необходимым и достаточным условием существования треугольника с тремя заданными сторонами является условие вида:
[latex] x + y > z[/latex] (вырожденный случай не рассматривается)

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

II. Вид треугольника определяется углом, лежащим против большей стороны:
[latex]\alpha \in [ 0; \frac{ \pi }{ 2 } ]\Leftrightarrow \cos{(\alpha)}>0[/latex]

Знак косинуса угла легко определить через теорему косинусов:
[latex]z^{ 2 }=x^{ 2 }+y^{ 2 }-2xy\cos { (\alpha ) } \\ \cos { (\alpha ) } =\frac { x^{ 2 }+y^{ 2 }-z^{ 2 } }{ 2xy }[/latex]

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

Программное решение состоит из двух этапов:
0. Поиск наибольшей стороны.
1. Проверка условия (I).
2. Проверка условия (II).

Функция swap() взята из заголовочного файла algorithm.
В программе использован тип данных с плавающей точкой и двойной точностью (для отображения действительных чисел).
Для выполнения программы и проверки тестов можно воспользоваться следующим объектом. (реализация на Java)

Related Images: