22.05.2017

 Разбор очного этапа краевой олимпиады 2017


Faster than light (A)


В задаче требовалось найти количество клеток 1х1 раскрашенного в клетку прямоугольника a на b таких, что они не пересекаются главной диагональю.
Посчитаем количество клеток, которые пересекает эта диагональ, а потом вычтем это число из a * b (здесь стоит заметить, что величина a*b может достигать 10^18, поэтому необходимо использование 64-битных типов переменных aka long long в С++).


Подсказки:
1) Главная диагональ пересекает ровно a клеток по вертикали и b по горизонтали, так как проходит от одного угла к противоположному. Какие-то из этих клеток посчитаны 2 раза.
2) Клетка пересекается, если диагональ проходит через её сторону или угол.
3) Понятно, что два раза посчитаны только те клетки, которые пересекаются по углу (так как они пересекаются и по "верхней" стороне, и по "боковой").
4) Чему равно количество таких клеток? Если диагональ проходит через угол клетки (x, y), то можно взять треугольник с вершинами (0, 0), (x, y), (0, y) и приложить его к точке (x, y), и тогда мы получим новую точку, являющуюся углом клетки (Это так, общие мысли)
5) Клеток, пересекаемых в углу, ровно НОД(a, b). Таким образом, ответ на задачу равен a * b - a - b + НОД(a, b).


Обнимашки (B)


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


Подсказки:
1) Из чего состоит ПСП? Либо из ПСП, обёрнутой в скобки(1), либо из двух ПСП, написанных подряд(2).
2) Ответ не может представляться двумя ПСП(2), так как на их стыке найдётся подстрока ")(".
3) Значит, нужно взять пустую строку и применять к ней операцию (1). Иными словами, ответом к ПСП длины n является ПСП из n/2 открывающих скобок и n/2 закрывающих. ((........))


Cписывание на ИЗО (С)


В задаче требовалось вывести координаты многоугольника из n вершин такого, что все его стороны целые.


Подсказки:
0) n <= 15, значит, можно вручную нарисовать 15 ответов и получить 100 баллов.
1) Для n = 4 решение очевидно - какой-нибудь прямоугольник(квадрат). Возможно, теперь с помощью этого можно получить решения для больших n.
2) Для n = 3 решением является треугольник с целыми сторонами. Самый простой способ - это взять какой-нибудь прямоугольный (пифагорову тройку, например, со сторонами 300, 400, 500) треугольник и бросить его на сетку координат.Возможно, теперь с помощью этого можно получить решения для больших n.
3) Давайте научимся делать из многоугольника с n вершинами многоугольник с n + 2 вершинами: просто "вогнём" один угол многоугольника внутрь. Если взять угол с сторонами, параллельными осям координат, то это очень просто, вы справитесь сами.
4) Можно придумать ещё парочку подобных преобразований, попробуйте сами.
5) Давайте научимся делать из многоугольника с n вершинами многоугольник с n + 4 вершинами, не трогая предыдущие вершины, а просто добавляя новые. Для этого возьмём сторону и "вырежем" из многоугольника клетку.
6) Заметим, что с помощью таких операций мы можем получить любое значение n из нужного диапазона.


Беспредельный драм-н-басс (D)


Задачу сложно переформулировать :) Будем обозначать подзадачи как (1) и (2) (без дополнительной операции и с ней соответственно).


Подсказки:
1) (1) Во сколько раз больше ритмов длины n + 1, чем ритмов длины n? Как получить из ритма длины n ритм длины n + 1?
2) (1) Ритмов длины n + 1 ровно в 2 раза больше, ведь можно взять любой ритм длины n и поднять/опустить любую руку.
3) (1) Соответственно количество ритмов длины n равно 2^n.
4) (2) Попробуйте воспользоваться методом динамического программирования.
5) (2) Пусть dp[n][a][b] - количество ритмов длины n таких, что после их проигрыша левая рука находится в позиции a, а правая в позиции b. Пусть a, b = 0 обозначает опущенную руку, a, b = 1 обозначает поднятую руку.
6) (2) Тогда переходы выглядят как dp[n + 1][!a][b] += dp[n][a][b], dp[n + 1][a][!b] += dp[n][a][b], dp[n + 1][0][0] += dp[n][1][1].


Математика для младшеклассников (Е)


Требуется найти p: a^p = b с точностью до 6 знаков после запятой.


Подсказки:
1) Давайте научимся возводить число в нецелую степень.
Будем рассматривать только 6 знаков после запятой в числе p. Представим его как 10^6 * p / 10^6.
Будем возводить число a в степень 10^6 * p, беря корень 10^6 степени каждый раз, когда число перестаёт влезать в ограничения. Взять корень можно бинпоиском по ответу.
А можно и попроще: в С++ существует функция pow(a, p), которая возвращает искомый результат в double.
2) a^x - возрастающая функция при a >= 1.
3) Воспользуемся бинпоиском по ответу.
4) Пусть l - левая граница, r - правая. Положим m = (l + r) / 2; если a^m < p, сдвинем левую границу, иначе правую. Будем делать так до тех пор, пока |r - l| > 0.000001.
5) Если вы знаете, что такое логарифмы, то можно решить уравнение a^p = b. Тогда p будет равно log(b) / log(a) по любому основанию.

 

Если у вас остались вопросы или вы - участник сложного тура, пишите мне в ВК : vk.com/id36828780 (Плешаков Алексей)

Адрес: 614039, г. Пермь, ул. Комсомольский проспект, 45
Телефон: +7 (342) 212-80-71
E-Mail: school9-perm@ya.ru
Вопрос администратору сайта