Задача А. Хоккей
Условие Сколько существует вариантов распределения комплекта медалей?
Ограничения N < 104 + 1
Задача А. Хоккей
Решение
Золотые медали могла получить любая из N команд. Серебряные – любая из оставшихся, то есть N-1 вариант. Бронзовые – N-2 команды.
Итого: N*(N-1)*(N-2)
Задача А. Хоккей
Особые случаи При N = 1 ответ 1 При N = 2 ответ 2
Задача В. Игра со спичками
Условие Можно брать одну, две или тысячу спичек. Выигрывает последний. Кто выиграет при N спичках?
Ограничения N < 104 + 1
Задача В. Игра со спичками
Идея решения Воспользуемся теорией игр. Будем отмечать “+” выигрышные состояния, а “-” - проигрышные.
Состояние с 0 спичек является для игрока проигрышным, так как его соперник уже выиграл на прошлом ходе, забрав последние спички.
Задача В. Игра со спичками
Отмечаем состояние знаком “+”, если существует хотя бы один ход, ведущий в состояние “-”. Так как он заставит противника капитулировать. В противном случае отмечаем состояние знаком “-”.
Задача В. Игра со спичками
Учитывая ограничения, можно реализовать
этот алгоритм. Но нетрудно заметить закономерность, что в
состояниях, кратных 3, стоит “-”. Обязательно необходимо проверить её и для больших чисел, когда можно будет брать по 1000 спичек.
0 1 2 3 4 5 6 7 8 9 10
- + + - + + - + + - +
Задача В. Игра со спичками
Решение
cin >> n; cout << (n%3 ? 1 : 2);
Задача С. Счастливые числа
Условие Найти количество чисел, состоящих из 4 и 7, не превосходящих N.
Ограничение N < 1032 + 1
Задача С. Счастливые числа
Идея решения Динамика по цифрам числа, начиная с младших разрядов. Будем считать количество счастливых чисел, если использовано ровно j младших разрядов.
Задача С. Счастливые числа
Пусть очередная цифра = 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
Задача D. Перетягивание каната
Условие Дан граф из N вершин. Разделить вершины на две группы, чтобы количество рёбер между вершинами одной группы было максимально.
Ограничение N < 25
Задача D. Перетягивание каната
Идея решения Учитывая сильные ограничения на N. Решать задачу можно перебором всех вариантов. Всего количество вариантов = 2N. Это укладывается в ограничения, но для каждого из них необходимо посчитать сплочённость, итого получаем O(N2 2N)
Задача D. Перетягивание каната
Оптимизация Пересчёт сплочённости можно выполнять за O(N), если перебор вести в порядке кодов Грея. Это пройдёт на хорошем сервере, но только не на acmp.
Задача D. Перетягивание каната
Решение Для полного решения воспользуемся рекурсивным перебором с отсечением.
void rec(int a, int k); где a – номер текущей вершины, k – количество человек в группе.
Спасибо за внимание
Ваши вопросы?