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

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

Задача

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

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

Количество дисков [latex] n (n ≤ 1000)[/latex].

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

Вывести минимальную сумму в гривнах для покупки [latex] n [/latex] дисков.

Тесты

Входные данные (число [latex] n [/latex]) Выходные данные (минимальная сумма, грн.)
1. 17 30
2. 7 14
3. 123 136
4. 24 38
5. 173 200
6. 108 116
7. 136 160

 

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

Решение

Для решения этой задачи мы должны вывести минимальную сумму для покупки[latex] n [/latex] дисков. Следует отметить, что для заданного числа [latex] n [/latex] дисков нам надо определить минимальную сумму, при этом мы можем покупать упаковку с большем количеством дисков, чем нужное нам [latex] n [/latex], если при этом итоговая сумма покупки получится меньше. Таким образом, мы аналитически определили, что если [latex]n\mod100 > 65[/latex] то экономней будет приобрести большую упаковку на 100 дисков за 100 грн., чем несколько более маленьких упаковок по 30 грн., и соответственно при [latex]n\mod20 > 15 [/latex] лучше приобрести одну упаковку на 20 дисков за 30 грн., чем по одному за 2 грн.

Оригинальное решение: cpp.mazurok.com.
Рабочий код для тестирования на try.haxe.org: Try Haxe !

e-olymp 128. Счастливые билеты

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

Задача

Подсчитайте количество счастливых билетов, у которых сума первых трёх цифр равна [latex]N[/latex].

Счастливым билетом называется билет с шестизначным номером, у которого сумма первых трёх цифр равна сумме трёх последних.

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

В единственной строке задано натуральное число [latex] N (N ≤ 27). [/latex]

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

Единственное число — количество счастливых билетов.

Тесты

Входные данные (число [latex] N [/latex]) Выходные данные (число билетов)
1. 1 9
2. 27 1
3. 0 1
4. 10 3969
5. 3 100

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

Решение
Любой шестизначный номер можно представить как 2 трехзначных номера.

Для решения задачи рассмотрим все варианты трехзначных номеров. Две первые цифры такого номера могут быть любыми. Переберем все их комбинации с помощью двух  циклов. А для определения третьей цифры будем использовать специальное условие. Она должна быть результатом вычитания двух первых цифр из [latex]N[/latex], и быть именно цифрой, то есть меньше 10.

Когда в цикле встречается подходящая комбинация, счетчик [latex]c[/latex] увеличивается на 1. Так как номер шестизначный, а счетчик [latex]c[/latex] подсчитывает удачные комбинации для трехзначного числа первой части, то и для трехзначного числа второй части он будет соответствовать. Следовательно, окончательное число комбинаций будет равно [latex]c \cdot c[/latex].

Оригинальное решение: cpp.mazurok.com.
Рабочий код для тестирования на try.haxe.org: Try Haxe !

e-olimp 248. Юный садовод

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

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

Мама попросила Васю полить все молодые деревца в саду. Вася знает, что пока деревья маленькие, их надо очень хорошо поливать. А вот сколько поливать — неизвестно. Но Вася — очень умный мальчик. Он внимательно прочитал весь учебник ботаники для средней школы и выяснил, что полив прямо пропорционален количеству листьев на дереве. Для хорошего роста деревьев достаточно выливать под дерево ежедневно по одному литру воды на каждый лист.

К счастью Васи оказалось, что листья на деревьях растут ярусами, причем на верхнем ярусе два листа, на втором — четыре, на следующем — шесть, и так далее, на каждом последующем ярусе на два листа больше по сравнению с предыдущим. А на самой верхушке растет еще один листик. Хитрый Вася послал младшую сестренку Машеньку подсчитать количество ярусов на каждом дереве, а Вас просит написать программу, которая для каждого дерева вычислит количество литров воды для его полива.

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

Количество ярусов [latex] n  (0 ≤ n ≤ 1000) [/latex] на дереве.

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

Вывести количество литров воды для полива этого дерева.

Тесты

Входные данные Выходные данные
1. 2 7
2. 5 31
3. 0 1
4. 70 4971

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

Решение

Как можно было заметить, по условию нашей задачи, на каждом следующем уровне на 2 листа больше чем на предыдущем. Поэтому для ее решения мы можем воспользоваться формулой суммы [latex]n[/latex]-первых членов арифметической прогрессии, и в конце расчетов добавить к полученной сумме единицу (тот самый листик с верхушки). Тогда подставив [latex] d = 2 , a_1 = 2, n = n [/latex]. Мы получим формулу [latex] S_n = \frac{2a_1 + (n — 1)d}{2} \cdot n \to n^2 + n [/latex].

 

Оригинальное решение: cpp.mazurok.com.
Рабочий код для тестирования на try.haxe.org: Try Haxe !

2.3.2 Наследование

Source: 2.3.2 Inheritance
Как во многих объектно-ориентированных языках, классы в языке Haxe являются основной структурой данных для большинства программ. Класс объявляется с помощью ключевого слова class . В классе может быть ноль или более полей класса. Пример класса Ogr, который представляет собой создание экземпляра класса Ogr, с полем life типа Int:

Экземпляр класса создается с помощью ключевого слова new:

Здесь метод toString() отображает представление экземпляра класса Ogr.

В Haxe классы могут наследовать от других классов, это осуществляется с помощью использования ключевого слова extends:

Так любой экземпляр класса Warrior также является экземпляром класса Ogr. В этом случае Ogr называется родительским классом для класса Warrior, а Warrior является дочерним классом для класса Ogr. У одного родительского класса может быть много дочерних классов, но у дочернего есть только один родительский класс. Определение «родительский класс класса X» обычно относится к его прямому родительскому классу, родительскому классу его родительского класса и т. д.

Вышеприведенный код класса Warrior очень похож на исходный код родительского класса Ogr, но в нем появляются две новые конструкции:

  • extends Ogr обозначает, что этот класс наследует класс Ogr
  • super (x, y) — вызывает конструктор родительского класса, в данном случае Ogr.new
  • override переопределяет метод toString()  родительского класса   Ogr

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

Создается экземпляр класса Warrior таким образом:

Где видно, что когда класс наследует другой класс он становится подтипом родительского класса, т.е. каждый экземпляр Warrior также является и экземпляром типа Ogr.

Подробнее про эффекты и ограничения переопределяющих методов можно прочитать в Overriding Methodsе.