Top Banner
Разбор задач 1 тура школьного этапа Кормышов Михаил http://krasprog.ru
17

Разбор задач

Nov 11, 2014

Download

Documents

Первый тур школьного этапа Всероссийской олимпиады школьников по информатике 2012

int

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Разбор задач

Разбор задач1 тура школьного этапа

Кормышов Михаил http://krasprog.ru

Page 2: Разбор задач

Задача А. Хоккей

Условие Сколько существует вариантов распределения комплекта медалей?

Ограничения N < 104 + 1

Page 3: Разбор задач

Задача А. Хоккей

Решение

Золотые медали могла получить любая из N команд. Серебряные – любая из оставшихся, то есть N-1 вариант. Бронзовые – N-2 команды.

Итого: N*(N-1)*(N-2)

Page 4: Разбор задач

Задача А. Хоккей

Особые случаи При N = 1 ответ 1 При N = 2 ответ 2

Page 5: Разбор задач

Задача В. Игра со спичками

Условие Можно брать одну, две или тысячу спичек. Выигрывает последний. Кто выиграет при N спичках?

Ограничения N < 104 + 1

Page 6: Разбор задач

Задача В. Игра со спичками

Идея решения Воспользуемся теорией игр. Будем отмечать “+” выигрышные состояния, а “-” - проигрышные.

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

Page 7: Разбор задач

Задача В. Игра со спичками

Отмечаем состояние знаком “+”, если существует хотя бы один ход, ведущий в состояние “-”. Так как он заставит противника капитулировать. В противном случае отмечаем состояние знаком “-”.

Page 8: Разбор задач

Задача В. Игра со спичками

Учитывая ограничения, можно реализовать

этот алгоритм. Но нетрудно заметить закономерность, что в

состояниях, кратных 3, стоит “-”. Обязательно необходимо проверить её и для больших чисел, когда можно будет брать по 1000 спичек.

0 1 2 3 4 5 6 7 8 9 10

- + + - + + - + + - +

Page 9: Разбор задач

Задача В. Игра со спичками

Решение

cin >> n; cout << (n%3 ? 1 : 2);

Page 10: Разбор задач

Задача С. Счастливые числа

Условие Найти количество чисел, состоящих из 4 и 7, не превосходящих N.

Ограничение N < 1032 + 1

Page 11: Разбор задач

Задача С. Счастливые числа

Идея решения Динамика по цифрам числа, начиная с младших разрядов. Будем считать количество счастливых чисел, если использовано ровно j младших разрядов.

Page 12: Разбор задач

Задача С. Счастливые числа

Пусть очередная цифра = Cj, ответ = R

j. Тогда:

Cj < 4, то R

j = 0

Cj = 4, то R

j = R

j-1

Cj > 4 and C

j < 7, то R

j = 2j-1

Cj = 7, то R

j = R

j-1 + 2j-1

Cj > 7, то R

j = 2j

Page 13: Разбор задач

Задача D. Перетягивание каната

Условие Дан граф из N вершин. Разделить вершины на две группы, чтобы количество рёбер между вершинами одной группы было максимально.

Ограничение N < 25

Page 14: Разбор задач

Задача D. Перетягивание каната

Идея решения Учитывая сильные ограничения на N. Решать задачу можно перебором всех вариантов. Всего количество вариантов = 2N. Это укладывается в ограничения, но для каждого из них необходимо посчитать сплочённость, итого получаем O(N2 2N)

Page 15: Разбор задач

Задача D. Перетягивание каната

Оптимизация Пересчёт сплочённости можно выполнять за O(N), если перебор вести в порядке кодов Грея. Это пройдёт на хорошем сервере, но только не на acmp.

Page 16: Разбор задач

Задача D. Перетягивание каната

Решение Для полного решения воспользуемся рекурсивным перебором с отсечением.

void rec(int a, int k); где a – номер текущей вершины, k – количество человек в группе.

Page 17: Разбор задач

Спасибо за внимание

Ваши вопросы?